【发布时间】: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