繁体   English   中英

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

[英]Forward mouse events from JList to the items in the list

目前,我有一个带有自定义CellRendererJlist ,如下所示。 我附加了一个自定义MouseListener以捕获悬停事件,以及稍后双击事件; 但是当我以这种方式添加它们时,事件并没有被解雇。 20分钟后,我发现这是因为JList阻止事件到达单个列表项。 有什么办法可以强制JList将鼠标事件转发给它的子元素,还是有更好的方法可以做到这一点。

我的CellRenderer:

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);
    }

}

我的MouseListener:

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;
}

提前致谢!

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

添加到渲染器时它不起作用的原因是渲染实际上仅用于..rendering。 它就像一个'模板',用于在项目出现在屏幕上之前绘制列表项(和所有其他可见列表项)。


..访问单元格..以改变背景..

配置ListCellRenderer来处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM