我有一个带有6个JScrollPane的大面板,每个JScrollPane都包含一个JList。
我正在尝试将MouseListener事件添加到面板上的每个JList中,我如何访问它?为了更好地理解,这是我的代码:

private void agregarDobleClick() {
    for (Component c : jPanel1.getComponents()) {

        c.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent evt) {
                JList list = (JList) evt.getSource();
                if (evt.getClickCount() == 2) {
                    Rectangle r = list.getCellBounds(0, list.getLastVisibleIndex());
                    if (r != null && r.contains(evt.getPoint())) {
                        modCitaPOPUP modcita = new modCitaPOPUP((Cita) list.getSelectedValue());
                        modcita.setVisible(true);
                    }
                }
            }
        });
    }

}


当我运行此命令时,它将mouseListener添加到JScrollPane中,并且当我双击JList项时,没有任何反应,因为mouseListener事件不存在。
谢谢。

最佳答案

根据您的描述,它看起来像是将MouseListener添加到JScrollPane而不是JList

简单的解决方案是制作特殊的MouseListener ...

public class ListMouseListener extends MouseAdapter {
    private JList list;
    public ListMouseListener (JList list) {
        this.list = list;
    }

    @Override
    public void mouseClicked(MouseEvent evt) {
        // Know you're self out with the list instance variable...
    }
}


并在创建时将其应用于每个JList ...

JList list = new JList();
list.addMouseListener(new ListMouseListener(list));


现在,如果您担心它们可能效率低下或占用大量内存(根据您的示例,不是),则可以创建一个通用的MouseListener,它使用事件源来确定触发它的人...

public class ListMouseListener extends MouseAdapter {

    @Override
    public void mouseClicked(MouseEvent evt) {
        Object source = evt.getSource();
        if (source instanceof JList) {
            JList list = (JList)source;
        }
    }
}


然后创建一个实例,并将其应用于所有JList实例...

ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);

关于java - 获取JScrollPane中包含的JList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22003328/

10-12 01:14