2

我有一个带有变量“优先级”的 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));

但是在这种情况下,我怎么知道哪个索引对应于已更改的字段?)

4

4 回答 4

4

有几种选择:

  • 将元素传递TrainingClass给您附加到文本字段的侦听器。这将需要在for您可以访问TrainingClassJTextField变量的循环中附加侦听器
  • Map按照@Ted Hopp的建议使用
  • List按照您的建议使用 a 。诀窍是在 中存储一个索引,JTextField以便之后您知道哪个JTextField对应于List. 您可以为此使用JComponent#putClientProperty和。JComponent#getClientProperty
  • 您可以使用这些JComponent#putClientPropertyJComponent#getClientProperty方法TrainingClass直接存储变量
于 2012-11-22T07:31:17.247 回答
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。

于 2012-11-22T07:30:52.680 回答
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);
}
于 2012-11-22T07:50:24.793 回答
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 并声明一个数据字段,然后您可以在事件处理中直接引用该字段。

于 2012-11-22T07:26:07.767 回答