#java #user-interface #io #jframe #jtextfield
#java #пользовательский интерфейс #io #jframe #jtextfield
Вопрос:
private void loadActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try{
FileReader reader = new FileReader("reload.txt");
BufferedReader br = new BufferedReader(reader);
koontf.read(br,null);
baamtf.read(br,null);
sachitf.read(br,null);
fakertf.read(br,null);
phonsekaltf.read(br,null);
lauretf.read(br,null);
yeontf.read(br,null);
aguerotf.read(br,null);
agnistf.read(br,null);
lokitf.read(br,null);
lawliettf.read(br,null);
ryuzakitf.read(br,null);
br.close();
koontf.requestFocus();
baamtf.requestFocus();
sachitf.requestFocus();
fakertf.requestFocus();
phonsekaltf.requestFocus();
lauretf.requestFocus();
yeontf.requestFocus();
aguerotf.requestFocus();
agnistf.requestFocus();
lokitf.requestFocus();
lawliettf.requestFocus();
ryuzakitf.requestFocus();
}catch(IOException e) {
}
}
Возможно ли вообще поместить каждую из них в определенное текстовое поле?Например, 12 в jtextfield1, 10 в jtextfield2 и так далее…Я пробовал некоторые учебные пособия и не могу в этом разобраться.
Комментарии:
1. лучше сохраняйте как json, считывайте его обратно и устанавливайте в соответствующее поле. для справки посмотрите на mkyong.com/java/json-simple-example-read-and-write-json
Ответ №1:
Вы можете поместить все свои текстовые поля в массив, а затем выполнить итерацию по этому массиву во время чтения текстового файла. Вот так:
JTextField[] textFields = new JTextField[10];
// ... init your textFields here
int line =0; // first line will be first textfield and so on
Scanner scanner = new Scanner(new File("reload.txt")); // use Scanner instead of FileReader, it's easier :)
while(scanner.hasNextLine()){ // as long as you did not reach the end of the file
textFields[line ].setText(scanner.nextLine()); // get the next line and put it in the respective textfield
}
Однако в этом случае вы должны убедиться, что для каждой строки есть текстовое поле или что вы не читаете больше строк, чем текстовых полей.
например:
while(.....){
....
if(line==textFields.length){
break;
}
}
Еще одна вещь, на которую следует обратить внимание, это то, что порядок строк должен соответствовать порядку ваших текстовых полей.
Редактировать
Я должен добавить, что все это может работать без каких-либо проблем. Но это не очень элегантное решение. Что происходит, когда вы меняете свой пользовательский интерфейс, а текстовые поля расположены в другом порядке? Или в вашем текстовом файле есть важная новая строка, но в вашем пользовательском интерфейсе нет текстового поля?
Редактировать 2
Код из вашего комментария не показывает, как вы помещаете JTextFields в свой массив. Я предполагаю, что вы используете какую-то среду IDE для создания графического интерфейса, поэтому у вас должен быть initComomponents();
вызов или что-то в вашем конструкторе. В этом случае удалите строку JTextField[] textFields = new JTextField[10];
из вашего loadActionPerformed
метода и поместите ее в свой конструктор следующим образом:
public class MyClass{
private JTextField[] textFields;
public MyClass(){
initComponents();
this.textFields = new JTextField[10] // where 10 is the number of lines in your textfile AND the number of JTextFields you have in your GUI
// then fill the array (by hand if you like)
this.textField[0] = koontf;
this.textField[1] = baamtf;
// and so on..
}
Редактировать 3
Просто чтобы было понятно, это то, что вам нужно для запуска программы. Допустим, ваш класс вызывается MyClass
, тогда он может выглядеть так:
private JTextField[] textFields; // this creates your array
public MyClass(){ // this is the constructor of your class (I don't know how it is called)
initComponents(); // auto generated code from NetBeans to initalize your GUI elements
// init your array
textFields = new JTextField[12]; // 12 if I counted correctly
// fill it
textFields[0] = koontf;
textFields[1] = baamtf;
textFields[2] = sachitf;
textFields[3] = fakertf;
textFields[4] = phonsekaltf;
textFields[5] = lauretf;
textFields[6] = yeontf;
textFields[7] = aguerotf;
textFields[8] = agnistf;
textFields[9] = lokitf;
textFields[10] = lawliettf;
textFields[11] = ryuzakitf;
}
private void loadActionPerformed(java.awt.event.ActionEvent evt){
int line = 0;
try(Scanner scanner = new Scanner(new File("reload.txt"))){
while(scanner.hasNextLine()){
textFields[line ].setText(scanner.nextLine());
if(line == textFields.length){
break;
}
}
}catch(FileNotFoundException ex){
Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex);
}
koontf.requestFocus(); // you can only call request focus on one element at a time (it does not make sense to call it on all textfields
}
Комментарии:
1. Я бы предпочел использовать a
Collection
вместо anArray
. Его размер можно изменить проще.2. Хороший момент! Мое личное предпочтение заключается
ArrayList<JTextField>
в том, что порядок элементов не меняется (в данном конкретном случае)3. выполнено частное действие с пустой загрузкой (java.awt.event. ActionEvent evt) { // TODO добавьте сюда свой код обработки: JTextField[] TextFields = new JTextField[10]; int line =0; Scanner сканер = новый сканер («reload.txt «); while(scanner.hasNextLine()){ Текстовые поля[строка ].setText(scanner.nextLine()); если(строка ==Текстовые поля. длина) { разрыв; } } }
4. Взгляните на мой отредактированный ответ ( редактирование 2 ). Там я покажу вам, как заполнить массив. Я предполагаю, что вы создали текстовое поле с помощью NetBeans и вызвали его
koonf
. Затем NetBeans напишет для вас вызываемый методinitComponents()
(он скрыт, и вы не можете изменить его напрямую), а внутриinitComponents()
где-то есть строкаthis.koontf = new JTextField()
. Все в порядке, как есть. Где-то в верхней части вашего файла находится конструктор вашего класса, и там вы должны увидеть строкуinitComponents();
. Заполните массив после этой строки следующим образом:textFields[0] = koontf;
5. Извините, я забыл
new File("...")
, чтобы сканер прочитал файл. Исправлено редактирование 3 .