Java 将鼠标事件从JList转发到列表中的项目

Java 将鼠标事件从JList转发到列表中的项目,java,swing,mouseevent,jlist,Java,Swing,Mouseevent,Jlist,目前,我有一个Jlist和一个自定义的CellRenderer,如下所示。我附加了一个自定义的MouseListener,以捕获悬停事件,然后双击事件;但当我这样添加事件时,它们并没有被触发。20分钟后,我发现这是因为JList阻止事件到达各个列表项。是否有任何方法可以强制JList将鼠标事件转发到其子元素,或者是否有更好的方法 我的手机: public class FriendRenderer extends DefaultListCellRenderer { private sta

目前,我有一个
Jlist
和一个自定义的
CellRenderer
,如下所示。我附加了一个自定义的
MouseListener
,以捕获悬停事件,然后双击事件;但当我这样添加事件时,它们并没有被触发。20分钟后,我发现这是因为
JList
阻止事件到达各个列表项。是否有任何方法可以强制
JList
将鼠标事件转发到其子元素,或者是否有更好的方法

我的手机:

public class FriendRenderer extends DefaultListCellRenderer {

    private static final long serialVersionUID = 1L;

    public Component getListCellRendererComponent(JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean hasFocus) {

        Friend friend = (Friend)value;

        JLabel label = new JLabel(friend.getName());

        JPanel mainOuterPanel = new JPanel();
        mainOuterPanel.setLayout(new BorderLayout());

        /* Adding components to mainOuterPanel... */

        /* Here is where I add the custom MouseListener */
        mainOuterPanel.addMouseListener(new ListItemMouseListener());

        return(mainOuterPanel);
    }

}
我的鼠标听者:

public class ListItemMouseListener implements MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {
        Component source = e.getComponent();
        source.setBackground(new Color(102, 99, 86));
        System.out.println("Mouse entered on " + source.toString());
    }

    @Override
    public void mouseExited(MouseEvent e) {
        Component source = e.getComponent();
        source.setBackground(null);
        System.out.println("Mouse Exited on " + source.toString());
    }
}
在JFrame中构建JList的位置:

private JList getFriendsList(){
    friendsList = new JList(getFriendsListModel()); //TODO Actually fill with data
    friendsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    friendsList.setLayoutOrientation( JList.VERTICAL );
    friendsList.addListSelectionListener(new FriendsListSelectionListener());
    friendsList.setCellRenderer(new FriendRenderer());
    return friendsList;
}

提前谢谢

将侦听器添加到列表中,并使用列表方法将点转换为行

将其添加到渲染器时无法工作的原因是渲染实际上仅用于渲染。它就像一个“模板”,用于在项目出现在屏幕上之前绘制列表项目(&其他所有可见的列表项目)


…进入牢房。。为了改变背景


配置以处理该问题。

@Brandon不确定在这种情况下,不了解
JList
(讨厌这个,使用
JTable
代替),如果(例如)
JToolTip
JList
正确触发事件,但是
JTable
JTable
有一列
和/或没有
JTableHeader
)是的,我想我已经在某个地方看到了。如何访问单元格布局以更改JList上侦听器的背景?我在JList界面中找不到任何方法。@mKorbel如果我无法轻松实现这一点,那么我可能会这样做。我有点困惑TreeCellRenderer将如何帮助我实现这一点更改列表项背景…作为旁注:尝试避免在
GetListCellRenderComponent
方法中创建新的
组件。最好调整现有组件并反复返回相同的组件。因此,您是否建议我像在构造函数中创建模板一样创建组件,然后修改并返回它每次?抱歉,如果我误解了,我对手工编写swing布局还不熟悉。这正是我的建议。好吧,我会试试的,谢谢!