2016-03-30 29 views
1

進出口尋找我的KeyListener的替代品使用的JButton。關鍵監聽器有方法,如果按下,如果釋放等我正在尋找做同樣的事情與這個JButton,Exp:如果用戶用鼠標點擊並在點擊位置持有鼠標代碼將執行,直到他/她釋放按鈕執行代碼將停止。如何使用JButton的「如果按下並釋放是否」

我想什麼?我試圖用的JButton起初這並沒有產生結果,我想是因爲形成我的理解的JButton需要一個完整的「點擊」我一直在玩JToggleButton中 如果(JToggButton.getModel()。isPressed()),這是還沒有工作,有人可以請指出我在正確的方向產生預期的結果?

具體目標:

我要使用的麥克風方法我建,我會點擊,說麥克風,我會按住一下,待我準備結束對着麥克風按鈕,想的Facebook如何用拇指按住麥克風,當你釋放它時,錄音停止,所以會有兩種方法startLogic();當按下並保持並停止邏輯();當,當用戶完成講話

+0

這似乎是一個切換按鈕是你想要的。更好地描述你想要達到的目標,併發布你的代碼。 –

+2

嘗試使用[的MouseListener](https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseListener.html)。 – DistribuzioneGaussiana

+1

一種方法:將一個ChangeListener添加到按鈕的ButtonModel中。 @DistribuzioneGaussiana:請注意,如果鼠標按鈕被非鼠標方式按下,如空格鍵 –

回答

6

需要注意的是一個簡單的,但錯誤的解決方法是使用的MouseListener終於發佈了,因爲這個監聽器錯誤並不按鈕按下而按下鼠標響應,如果它被按下,這將錯過按下按鈕通過除鼠標之外的其他任何方式,例如空格鍵。

我會聽按鈕的ButtonModel的以及ChangeListener,並在其isPressed()狀態的變化。無論按什麼按鈕,無論是鼠標還是空格鍵,這都可以工作。例如:

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

@SuppressWarnings("serial") 
public class ButtonPressTest extends JPanel { 
    private JButton button = new JButton("Button"); 
    private JTextArea textArea = new JTextArea(15, 15); 

    public ButtonPressTest() { 
     button.getModel().addChangeListener(new BtnModelListener()); 
     textArea.setFocusable(false); 
     add(button); 
     add(new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
             JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); 
    } 

    private class BtnModelListener implements ChangeListener { 
     private boolean pressed = false; // holds the last pressed state of the button 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      ButtonModel model = (ButtonModel) e.getSource(); 

      // if the current state differs from the previous state 
      if (model.isPressed() != pressed) { 
       String text = "Button pressed: " + model.isPressed() + "\n"; 
       textArea.append(text); 
       pressed = model.isPressed(); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("ButtonPressTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ButtonPressTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+1

不錯的觀察結果,MouseListener將不起作用。大多數人會用MouseListener來做到這一點。 –

+0

我認爲這將最適合我的需求,1 +爲你設置的方式,因爲我也在考慮使用mouslistener,但也意識到它不能正常工作,我給你的答案雖然是教學我今天的事:) – Sleeking

相關問題