JList鼠标移动和鼠标按下事件

3

我扩展了JList以提供两个不同的功能:项工具提示文本和右键单击选项。这两个功能分开使用时都能正常工作,但是当我尝试同时使用它们时,MouseMoved事件无法被识别?以下是我的新侦听器方法要点。如何处理这些不同的事件?

public class JListTT extends javax.swing.JList {
    public JListTT() {
        super();
       addMouseListener(new ttListener());
...
   class ttListener extends MouseAdapter {
        public void mouseMoved(MouseEvent e) {
             String nodeID = bldItemNodeID();
             theList.setToolTipText(nodeID);
            }
        public void mousePressed(MouseEvent ev)  {check(ev); }
        public void mouseReleased(MouseEvent ev) {check(ev); }
        public void mouseClicked(MouseEvent ev)  {check(ev); }
        public void check(MouseEvent ev) {
            if (ev.isPopupTrigger()) { 
                theList.setSelectedIndex(theList.locationToIndex(ev.getPoint())); 
                menu.show(theList, ev.getX(), ev.getY()); 
            }
        }
    }

请学习Java命名规范并遵循它们。 - kleopatra
@Dave Clemmer,请问您为什么清理了一个标签? - mKorbel
4个回答

4
您将ttListener对象添加为MouseListener,但我没有看到您将ttListener对象添加为MouseMotionListener。例如:


您需要将ttListener对象作为MouseMotionListener添加以便能够响应鼠标移动事件。例如:
ttListener myMouseadapter = new ttListener();
addMouseListener(myMouseadapter);
addMouseMotionListener(myMouseadapter);

我曾经认为添加一个addMouseListener(new ttListener())就可以同时实现addMouseListener和addMouseMotionListener子类型,但是我猜想不行,因为这个方法可行!非常感谢。 - rikb
@rikb:是的,MouseListener只监听静态鼠标动作——mousePress、mouseRelease、mouseClick等,而MouseMotionListener将监听动态鼠标事件。不客气! - Hovercraft Full Of Eels

2
我自己没有测试过,但是查看了 JList 的 javadoc,提示功能已经默认可用。JList#getTooltipText 的 javadoc 明确说明:

覆盖 JComponent 的 getToolTipText 方法,以便允许使用渲染器的提示文本(如果已设置)。

因此,如果您的 ListCellRenderergetListCellRendererComponent 方法中返回一个带有 tooltipComponent,它将被 JList 显示,而无需侦听器。

1

并不一定需要使用自定义的鼠标/动作监听器来实现低级别的方法:

  • 关于每个单元格的工具提示,请参见@Robin的答案
  • 关于上下文菜单,JComonent有一个属性componentPopupMenu:使用它将自动处理通过键盘快捷键打开菜单的情况

"不一定"是因为您似乎依赖于右键单击时选择单元格。如果是这样,您仍需要一个MouseListener来触发选择(经过十年的辩论后,Swing没有 - 这在当前本地应用程序中似乎不寻常;-)


0

你可以通过使用mouseDragged来实现它

YourClass extends JPanel implements MouseListener{
    ......

    @Override
    public void mouseDragged(MouseEvent e) {
        //code go here

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接