2014-01-29 220 views
0

我想知道是否可以使用事件監聽器而不是鼠標監聽器來雙擊JButton。考慮下面的代碼;事件監聽器和鼠標監聽器

public void actionPerformed(ActionEvent arg0){ 
    if (arg0.getClickCount() == 2){ 
     System.out.println("You Doubled clicked"); 
    } 
} 

我收到一個錯誤,說getClickCount() is undefined for the type ActionEvent。鼠標的點擊或雙擊不被視爲事件嗎?思考。

回答

0

你想用一個MouseAdapter。它允許你不要用不必要的方法混淆你的代碼(mouseDraggedmouseEntered等)。

public class MyClass extends MouseAdapter { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (e.getClickCount() == 2) { 
      // Double click 
     } else { 
      // Simple click 
     } 
    }  
} 

另外,如果你的類已經擴展了另一個類,試試這個代碼:

public class MyClass extends MyBaseClass { 
    private MouseAdapter ma; 

    public MyClass() { 
     final MyClass that = this; 
     ma = new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       that.myMouseClickedHandler(e); 
      } 
     }; 
    } 

    public void myMouseClickedHandler(MouseEvent e) { 
     if (e.getClickCount() == 2) { 
      // Double click 
     } else { 
      // Simple click 
     }   
    } 
} 
+0

答案取決於OP是否只想知道鼠標點擊或想要繼續支持正常的交互(如[enter]或[space]) – MadProgrammer

1

你不能。如果您不確定,請閱讀文檔。方法OnClickCount不存在於Action Event類中,它僅在MouseEvent類中可用。如果你想要,然後寫你自己的方法。

請參見以下文檔以供參考

http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionEvent.html

http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html

+0

有關如何創建我自己的方法來檢查是否連續單擊JButton或雙擊的任何建議?道歉,如果這是一個天真的問題。我對Java仍然很陌生。 – Hustl3r28

+1

你爲什麼要重新發明輪子?使用此方法 btn.addMouseListener(新java.awt.event.MouseAdapter(){ 公共無效的mouseClicked(java.awt.event.MouseEvent中EVT){ 如果(evt.getClickCount()== 2){ //做你想在這裏的東西 } } }); – Hamza

0

動作事件不具有 「getClickCount()」 方法。
參見文檔:ActionEvent API Doc

你可以在actionPerformed方法定義一個變量「numClicks」:

public void actionPerformed(ActionEvent e) { 
    numClicks++; 

那麼,如果「numClicks」等於「2」,發生了鼠標的雙擊,那麼你可以將其設置回零等...

+0

雖然這種方法更好地滿足了用戶的要求,但它仍然存在如何確定用戶是否只點擊一次,離開一段時間後再點擊 – MadProgrammer

0

答案取決於。你只想知道按鈕什麼時候被「點擊」兩次或者什麼時候被「按下」兩次?

它一般不提倡到MouseListener附加到一個按鈕,該按鈕可以以多種方式被觸發,包括編程

你所需要的是能夠做到的,是不是隻算次數actionPerformed被調用,但也知道點擊之間的時間。

您可以記錄最後一次點擊時間,並將其與當前時間進行比較,並以此方式進行確定,或者您可以簡單地使用javax.swing.Timer這將爲您做。

下面的例子還檢查,看是否ActionEvent的最後一個來源是一樣的電流源,如果它不是計數器復位......

這也使得鼠標點擊,按鍵和方案觸發器...

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TimerButton { 

    public static void main(String[] args) { 
     new TimerButton(); 
    } 

    public TimerButton() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JButton btn = new JButton("Testing"); 
       btn.addActionListener(new ActionHandler()); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       frame.add(btn); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ActionHandler implements ActionListener { 

     private Timer timer; 
     private int count; 
     private ActionEvent lastEvent; 

     public ActionHandler() { 
      timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Tick " + count); 
        if (count == 2) { 
         doubleActionPerformed(); 
        } 
        count = 0; 
       } 
      }); 
      timer.setRepeats(false); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (lastEvent != null && lastEvent.getSource() != e.getSource()) { 
       System.out.println("Reset"); 
       count = 0; 
      } 
      lastEvent = e; 
      ((JButton)e.getSource()).setText("Testing"); 
      count++; 
      System.out.println(count); 
      timer.restart(); 
     } 

     protected void doubleActionPerformed() { 
      Object source = lastEvent.getSource(); 
      if (source instanceof JButton) { 
       ((JButton)source).setText("Double tapped"); 
      } 
     } 


    } 

} 
+0

我想知道是否按了兩次按鈕。 – Hustl3r28

+0

是的,這會告訴你它是否被「按下」兩次,不管它是通過鼠標,鍵盤還是以編程方式 – MadProgrammer