【问题标题】:JList MouseMoved and MousePressedJList MouseMoved 和 MousePressed
【发布时间】:2012-01-12 11:20:03
【问题描述】:

我扩展了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命名约定并遵守它们
  • @Dave Clemmer 请问你为什么要清理标签之一,

标签: java swing mouseevent mouse jlist


【解决方案1】:

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

ttListener myMouseadapter = new ttListener();
addMouseListener(myMouseadapter);
addMouseMotionListener(myMouseadapter);

【讨论】:

  • 我原以为添加一个 addMouseListener(new ttListener()) 可以同时为 addMouseListener 和 addMouseMotionListener 子类型完成它,但我想这不是因为它有效!非常感谢。
  • @rikb:是的,MouseListener 只监听静态鼠标动作——mousePress、mouseRelease、mouseClick 等,而 MouseMotionListener 将监听动态鼠标事件。不客气!
  • 有机会请mark this answer correct
【解决方案2】:

我自己没有对此进行测试,但查看 JList 的 javadoc 时,工具提示功能是开箱即用的。 JList#getTooltipText 的 javadoc 明确指出

重写 JComponent 的 getToolTipText 方法以允许 如果设置了文本,则使用渲染器的提示。

因此,如果您的 ListCellRenderer 在具有 tooltipgetListCellRendererComponent 方法中返回 Component,它将由 JList 显示,而无需侦听器。

【讨论】:

    【解决方案3】:

    不一定需要低级方法作为自定义鼠标/motionListener:

    • 关于每个单元格的工具提示,请参阅@Robin 的回答
    • 对于上下文菜单,JComonent 有一个属性 componentPopupMenu:使用它可以自动打开键盘快捷键上的菜单

    “不一定”,因为您似乎依赖于右键单击时选择的单元格。如果是这样,您仍然需要一个 MouseListener 来触发选择(经过长达十年的争论,Swing 没有——这在当前的原生应用程序中似乎很不寻常;-)

    【讨论】:

      【解决方案4】:

      您可以使用 mouseDragged

      来实现
      YourClass extends JPanel implements MouseListener{
          ......
      
          @Override
          public void mouseDragged(MouseEvent e) {
              //code go here
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-04
        • 2021-12-30
        • 2012-08-21
        • 1970-01-01
        • 2011-11-24
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多