Java 获取JScrollPane中包含的JList

Java 获取JScrollPane中包含的JList,java,swing,jscrollpane,jlist,mouselistener,Java,Swing,Jscrollpane,Jlist,Mouselistener,我有一个内部有6个JScrollPane的大面板,每个JScrollPane都包含一个JList。 我正在尝试将MouseListener事件添加到面板上的每个JList中,如何访问它?为了更好地理解,以下是我的代码: private void agregarDobleClick() { for (Component c : jPanel1.getComponents()) { c.addMouseListener(new MouseAdapter() {

我有一个内部有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事件不在那里。 谢谢。

根据您的描述,它“看起来”像是将
鼠标侦听器添加到
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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
并在创建时将其应用于每个
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
的所有实例

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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
根据您的描述,“看起来”您正在将
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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
并在创建时将其应用于每个
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
的所有实例

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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
根据您的描述,“看起来”您正在将
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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
并在创建时将其应用于每个
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
的所有实例

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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
根据您的描述,“看起来”您正在将
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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);
并在创建时将其应用于每个
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
的所有实例

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...
    }
}
ListMouseListener singleInstance = new ListMouseListener();
//...
JList list = new JList();
list.addMouseListener(singleInstance);

创建鼠标侦听器时,将其添加到
JList
s;那时它们就可以使用了,你不必费力地通过组件树找到它们。看起来就像你在用一把12 Ga的猎枪猎杀麻雀。当然,你会得到很多羽毛,但不会留下多少鸟。与其随意将鼠标指示器添加到JPanel上的组件中,从而错过JList,为什么不对JLists本身进行适当的引用,然后将鼠标指示器直接添加到JList引用中?@hovercraftfullofels“看起来就像你试图用一把12 Ga的猎枪猎杀麻雀”我知道我这个周末要做什么!好的,我试图“避免”使用for循环写更多的行,但我会这样做,谢谢。@Josemiguellelón您已经使用了for循环。您可以将所有
JList
保存在某种数组中,或者
列表
添加可能是4行代码,并将
for循环
更改为访问它…在创建鼠标侦听器时将其添加到
JList
中;那时它们就可以使用了,你不必费力地通过组件树找到它们。看起来就像你在用一把12 Ga的猎枪猎杀麻雀。当然,你会得到很多羽毛,但不会留下多少鸟。与其随意将鼠标指示器添加到JPanel上的组件中,从而错过JList,为什么不对JLists本身进行适当的引用,然后将鼠标指示器直接添加到JList引用中?@hovercraftfullofels“看起来就像你试图用一把12 Ga的猎枪猎杀麻雀”我知道我这个周末要做什么!好的,我试图“避免”使用for循环写更多的行,但我会这样做,谢谢。@Josemiguellelón您已经使用了for循环。您可以将所有
JList
保存在某种数组中,或者
列表
添加可能是4行代码,并将
for循环
更改为访问它…在创建鼠标侦听器时将其添加到
JList
中;那时它们就可以使用了,你不必费力地通过组件树找到它们。看起来就像你在用一把12 Ga的猎枪猎杀麻雀。当然,你会得到很多羽毛,但不会留下多少鸟。与其随意将鼠标指示器添加到JPanel上的组件中,从而错过JList,为什么不对JLists本身进行适当的引用,然后将鼠标指示器直接添加到JList引用中?@hovercraftfullofels“看起来就像你试图用一把12 Ga的猎枪猎杀麻雀”我知道我这个周末要做什么!好的,我试图“避免”使用for循环写更多的行,但我会这样做,谢谢。@Josemiguellelón您已经使用了for循环。你可以保留所有的钱