【问题标题】:Forward mouse events from JList to the items in the list将鼠标事件从 JList 转发到列表中的项目
【发布时间】:2012-06-09 08:12:17
【问题描述】:

目前,我有一个Jlist 和一个自定义CellRenderer,如下所示。我附加了一个自定义 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);
    }

}

我的鼠标监听器:

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

提前致谢!

【问题讨论】:

  • 附带说明:尽量避免在getListCellRendererComponent 方法中创建新的Components。最好调整现有组件并一遍又一遍地返回相同的组件
  • 那么,你是否建议我在构造函数中创建一个模板,然后每次修改它并返回它?对不起,如果我误会了,我是手动编码摇摆布局的新手。
  • 这正是我的建议
  • 好的,我试试,谢谢!

标签: java swing mouseevent jlist


【解决方案1】:

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

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


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

配置ListCellRenderer 来处理这个问题。

【讨论】:

  • @Brandon 在这种情况下不确定,不是对JList 的最深入了解(讨厌这个,使用JTable 代替),如果(例如)JToolTip 正确地从@987654326 触发事件@ 但JTable 没有任何问题(JTable 有一个Column 和/或没有JTableHeader
  • 没错,我想我在某处看到过。但是如何访问单元格布局以更改 JList 上侦听器的背景?我在 jlist 界面中找不到任何方法。
  • @mKorbel 如果我不能轻松完成这项工作,那么我可能就只能这样做了。
  • 我有点困惑 TreeCellRenderer 将如何帮助我更改列表项背景...
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多