Java:根据动态生成的文本字段名称更改变量?

时间:2012-11-22 07:19:46

标签: java swing variables dynamic jtextfield

我有一个具有变量“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));

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

4 个答案:

答案 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循环中附加监听器,您可以访问TrainingClassJTextField变量
  • 使用@Ted Hopp建议的Map
  • 按照您的建议使用List。诀窍是在JTextField中存储索引,以便之后您知道哪个JTextField对应List中的哪个元素。您可以使用JComponent#putClientPropertyJComponent#getClientProperty进行此操作。
  • 您可以使用JComponent#putClientPropertyJComponent#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);
}