Почему я не могу сначала подсчитать количество кликов == 2 в Java?

В моем приложении 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? Зачем? Как это исправить?

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);
Другие вопросы по тегам