【问题标题】:Why can't I get to mouse click count == 2 first in Java?为什么我不能在 Java 中首先获得鼠标点击计数 == 2?
【发布时间】:2015-03-11 21:58:02
【问题描述】:

在我的 Java Swing 应用程序中,我有一个 JList,当我双击列表中的一个项目时,它总是先点击计数 == 1,然后点击计数 == 2,为什么?

 list.addMouseListener(new MouseAdapter()
 {
   public void mouseClicked(MouseEvent e)
   {
     if (SwingUtilities.isLeftMouseButton(e))
     {
       if (e.getClickCount()==1) Out("Left-ClickCount()==1");
       else if (e.getClickCount()==2) Out("Left-ClickCount()==2");     
     }
     else if (SwingUtilities.isRightMouseButton(e))
     {
       if (e.getClickCount()==2) Out("Right-ClickCount()==2");
       else if (e.getClickCount()==1) Out("Right-ClickCount()==1");
     }
   }
 });

无论我点击多快,我故意把“if (e.getClickCount()==2)”放在“else if (e.getClickCount()==1)”之前,它仍然先捕获ClickCount==1 ?为什么 ?如何解决?

【问题讨论】:

  • 这就是它的工作方式。通常第一次单击是选择要处理的行,双击是对该行执行一些操作。这不是 Java 的事情。这是标准的应用程序设计,也就是说,双击应该只对第一次选择的项目起作用。快速单击鼠标每次只会增加单击次数。它不会等到您停止单击后再确定是单击、双击还是三次单击。
  • @camickr 这也是 JList 的事情。其他组件不会像那样吃鼠标点击。如果您将 JList 单元格禁用为不可编辑,则双击将按 OP 的预期工作。
  • @AdriaanKoster,这不是 JList 特定的。 JList 不可编辑。我想你的意思是JTable。在任何情况下,JTable 的工作方式都与 JList 相同。如果表格不可编辑,您可以继续点击,点击次数将不断增加。不同之处在于,当表格可编辑时,您只能单击和双击,然后调用编辑器,因此以后的点击将在编辑器上,而不是在表格上。关键是在双击之前您总是会单击一次,这是应该的方式。
  • 如果是这样,如何设计我的应用程序,以便单击鼠标右键播放 mp3 文件,但双击鼠标右键打开 mp3 文件进行编辑?
  • 看看您系统上的音乐播放器。我通常看到的标准设计是单击(或键盘上的上/下键)将选择一首歌曲。然后双击(或使用键盘上的 Enter)将播放歌曲。不要忘记适当的 GUI 设计应该允许您使用鼠标或键盘。然后进行编辑,您将使用右键单击弹出该歌曲的选项菜单。

标签: java swing jlist click-counting


【解决方案1】:

好的,经过一些 Goggling 和我自己的改进,这里是符合我最初期望的代码:

  boolean isAlreadyOneClick=false;
...
    DefaultListModel xlistModel=new DefaultListModel();
    JList xlist=new JList(xlistModel);
    xlist.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        int index=xlist.locationToIndex(e.getPoint());
        String item=xlistModel.getElementAt(index).toString();

        if (SwingUtilities.isLeftMouseButton(e))
        {
          if (isAlreadyOneClick)
          {
            System.out.println("Left double click : "+item);
            isAlreadyOneClick=false;
          }
          else
          {
            isAlreadyOneClick=true;
            Timer t=new Timer("doubleclickTimer",false);
            t.schedule(new TimerTask()
            {
              @Override
              public void run()
              {
                if (isAlreadyOneClick) System.out.println("Left single click : "+item);
                isAlreadyOneClick=false;
              }
            },250);
          }              
        }
        else if (SwingUtilities.isRightMouseButton(e))
        {
          if (isAlreadyOneClick)
          {
            System.out.println("Right double click : "+item);
            isAlreadyOneClick=false;
          }
          else
          {
            isAlreadyOneClick=true;
            Timer t=new Timer("doubleclickTimer",false);
            t.schedule(new TimerTask()
            {
              @Override
              public void run()
              {
                if (isAlreadyOneClick) System.out.println("Right single click : "+item);
                isAlreadyOneClick=false;
              }
            },250);
          }
        }
      }
    });

    xlistModel.addElement("123");
    xlistModel.addElement("abc");
    JFrame f=new JFrame("Test Clicks");
    f.add(xlist);
    f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { } });
    f.setBackground(SystemColor.control);

    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多