3

私の 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");
     }
   }
 });

どんなに速くクリックしても、意図的に「else if (e.getClickCount()==1)」の前に「if (e.getClickCount()==2)」を配置しましたが、それでも最初に ClickCount==1 をキャッチしますか? なんで ?それを修正する方法?

4

1 に答える 1

2

OK、いくつかのゴーグルと私自身の機能強化の後、これが私の最初の期待どおりに機能するコードです:

  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);
于 2015-03-12T16:43:03.897 に答える