我有一个具有变量“priority”的TrainingClass对象的ArrayList。
我正在创建一个设置框架,对于当前在ArrayList中的每个元素,我创建一个用户设置优先级的TextField。
这就是它的生成方式
for (TrainingClass tclass : mTrainingClasses) {
//Loop the ArrayList
JTextField txtPriority = new JTextField(3);
txtPriority.setBounds(10,10,100,20);
txtPriority.setText("" + tclass.getPriority());
getContentPane().add(txtPriority);
}
现在我要添加一个更改侦听器,但是......
一旦我知道哪个字段已被更改,我如何访问ArrayList mTrainingClasses的正确元素?
例如,在php中,我会简单地创建:
$mTrainingClasses->$changed_field->setPriority($new_value);
但是,据我所知,我不能用Java做到这一点。那么,我该怎么办?
我是否需要为每个元素手动设置字段名称和侦听器?我确定还有其他一些解决方案,但我现在还不知道。
(我知道我也可以在字段中使用ArrayList,例如
txtPriority.add(new JTextField(3));
但在这种情况下,我如何知道哪个索引对应于已更改的字段? )
答案 0 :(得分:4)
有一个文本字段列表
List<JTextField> textFields = new ArrayList<JTextField>();
如下所示更改循环,将所有文本字段添加到上面的列表
for (TrainingClass tclass : mTrainingClasses) {
//Loop the ArrayList
JTextField txtPriority = new JTextField(3);
txtPriority.setBounds(10,10,100,20);
txtPriority.setText("" + tclass.getPriority());
getContentPane().add(txtPriority);
textFields.add(txtPriority);
}
在您的听众中,您可以执行以下操作
mTrainingClasses.get(textFields.indexOf((JtextField) event.getSource()));
以上将返回已更改的TrainingClass。
答案 1 :(得分:4)
有几种选择:
TrainingClass
元素传递给附加到文本字段的侦听器。这需要在您for
循环中附加监听器,您可以访问TrainingClass
和JTextField
变量Map
List
。诀窍是在JTextField
中存储索引,以便之后您知道哪个JTextField
对应List
中的哪个元素。您可以使用JComponent#putClientProperty
和JComponent#getClientProperty
进行此操作。JComponent#putClientProperty
和JComponent#getClientProperty
方法直接存储TrainingClass
变量答案 2 :(得分:3)
在循环中,您可以填充Map<JTextField, TrainingClass>
。然后,您可以使用它从更改的字段中查找元素。
Map<JTextField, TrainingClass> fieldMap = new HashMap<>();
for (TrainingClass tclass : mTrainingClasses) {
//Loop the ArrayList
JTextField txtPriority = new JTextField(3);
txtPriority.setBounds(10,10,100,20);
txtPriority.setText("" + tclass.getPriority());
getContentPane().add(txtPriority);
map.put(txtPriority, tclass);
}
或者,您可以继承JTextField并声明一个数据字段,然后可以在事件处理中直接引用该数据字段。
答案 3 :(得分:3)
您需要在JTextField和TrainingClass之间进行某种映射。要么将文本字段作为类的属性,要么制作映射这两者的地图。
Map<TrainingClass, JTextField> myMap= new HashMap<TrainingClass, JTextField>();
for (TrainingClass tclass : mTrainingClasses) {
//Loop the ArrayList
JTextField txtPriority = new JTextField(3);
txtPriority.setBounds(10,10,100,20);
txtPriority.setText("" + tclass.getPriority());
getContentPane().add(txtPriority);
// map the textField to the training class
myMap.put(txtPriority, tclass);
}
当字段在侦听器方法中更改时,您只需调用:
public void eventListenerMethod(InputEvent e) {
JTextField fieldThatGeneratedEvent= e.getSource();
TrainingClass tClass= myMap.get(fieldThatGeneratedEvent);
}