如何使用documentListener获取对象的索引?

时间:2015-08-04 12:49:36

标签: java arraylist indexing jtextfield documentlistener

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

我想&#34;更新&#34;列表B的元素与列表A中的元素的相同索引与CustomTextField中的值匹配。

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

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

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

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

    }

我还在CustomTexField类中创建了一个方法,该方法在创建索引时保存索引但不知道如何阅读&#39;来自e.getDocument()

编辑:更新标题

3 个答案:

答案 0 :(得分:1)

如果您只是想在arraylist中获取项目的索引,则可以使用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();
    }

}

答案 1 :(得分:0)

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

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

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

获取此ID并获取您的标签:

JLabel label = lblMap.get(id);

设置标签文字:

label.setText = customTextField.getText();

答案 2 :(得分:0)

我找到了答案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      
    }

}