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布局还不熟悉。这正是我的建议。好吧,我会试试的,谢谢!