【问题标题】:How to get index of an object with documentListener?如何使用 documentListener 获取对象的索引?
【发布时间】:2015-10-26 21:19:53
【问题描述】:

我在 JFrame 中垂直显示了 2 个列表。假设列表 A 是 ArrayList<CustomTexField>,列表 B 是 ArrayList<JLabel>

我想用 CustomTextField 中的值“更新”列表 B 中与列表 A 中相同元素索引匹配的元素。

我试过添加文档监听器,但不知道如何计算索引。

@Override
    public void insertUpdate(DocumentEvent e) {
        try {

            listB().get(INDEX).setText(e.getDocument().getText(0, e.getDocument().getLength()) + "");

        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }

    }

我还在CustomTexField 类中创建了一个方法,该方法在创建索引时保存索引,但不知道如何从e.getDocument()“读取”它

编辑:更新的标题

【问题讨论】:

  • 如果您只是询问如何获取 ArrayList 中某个项目的索引,您可以使用arrayList.indexOf(itemYouWant)
  • 那么你想从列表 B 中获取与正在插入/更新的元素相对应的元素吗?
  • -是的@Thomas。 indexOf 不起作用,因为我不知道 itemIWant 是什么。取决于编辑哪个txtfield
  • 我做不到 listB().inexOf(e.getDocument()); 。我想做类似的事情,从文档中转换给我错误:(
  • 我猜您无论如何都将侦听器添加到每个文本字段的文档中,因此您只需为该侦听器提供对相应标签的引用并相应地更新它。维护 2 个单独的列表并通过索引连接并不是那么健壮(如果只有一个列表更改为某些编程错误等怎么办?)。

标签: java arraylist indexing jtextfield documentlistener


【解决方案1】:

如果您只是想获取数组列表中某个项目的索引,则可以使用indexOf 方法。

int indexOfItem = arrayList.indexOf(itemIWant)

这正是我对您问题的解释,但我希望得到澄清。

编辑:如果您尝试将对象附加到 DocumentListener,您可以查看以下问题:how to find source component that generated a DocumentEvent

基本上,如果每个 CustomTextField 都有一个 DocumentListener,则可以使用链接中描述的 putProperty 方法将其自身附加到它。从那里,您可以使用getProperty(item) 查找该项目。如果需要,您可以对索引执行类似的操作,但我相信,由于您的 CustomTextField 定义中有一个索引字段,因此只需将 CustomTextField 与 DocumentListener 附加就足够了。

//sometime on initalization of the lists
for(CustomTextField field: listA):
    field.getDocument().putProperty("owner", field);

...

@Override
public void insertUpdate(DocumentEvent e) {
    try {
        CustomTextField field = e.getDocument().getProperty("owner");
        int index = field.getIndex(); //assuming you have a getter method
        listB().get(index).setText(listA.get(index).getText());

    } catch (BadLocationException e1) {
        e1.printStackTrace();
    }

}

【讨论】:

  • 是的,但是如何计算“INDEX”,我不想每次在文本字段中写东西时循环遍历列表中的所有元素。
  • 那么您是在问如何获取与文档侦听器对应的项目的索引,以便您可以更新它对应的JLabel?
  • 这正是我想要的@Jeremy Fisher
【解决方案2】:

我会将您的所有CustomTextFields 存储在Map<String, Integer> 中,其中键是CustomTextField 的名称,值是唯一标识符。然后我会将您的所有Labels 放在另一个Map<Integer, Label> 中,其中键是一个唯一标识符,对应于与CustomTextField 匹配的唯一标识符。

现在在您的 insertUpdate() 中,您知道哪个 CustomTextField 正在更新,因此获取它的唯一标识符,例如:

int id = ctfMap.get(customTextField.getName());

获取此 ID 并获取您的标签,如下所示:

JLabel label = lblMap.get(id);

设置标签的文字:

label.setText = customTextField.getText();

【讨论】:

    【解决方案3】:

    我找到了答案 here 。我还在 CustomTextFields 中添加了 focusListener,因此当覆盖 focusGained 方法时,我可以获得调用事件的对象并将其转换为我的自定义类。

    private class ListenForDoc implements DocumentListener, FocusListener{
        int index;
        @Override
        public void insertUpdate(DocumentEvent e) {
            try {
    
                listB().get(index).setText(e.getDocument().getText(0, e.getDocument().getLength()));
    
    
            } catch (BadLocationException e1) {
                e1.printStackTrace();
            }
    
        }
    
        @Override
        public void removeUpdate(DocumentEvent e) {
            //TO DO
    
        }
    
        @Override
        public void changedUpdate(DocumentEvent e) {}
    
    
        @Override
        public void focusGained(FocusEvent e) {
            Object o = e.getSource();
            if(o instanceof CustomTextField) {
                index = ((CustomTextField)o).getIndex();    
            }
            else{
            //HandleError
            }
        }
    
        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub      
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多