2016-03-30 16 views
1

Anahtar Listeleyicimin yerine JButton'u kullanmayı düşünüyorum. Anahtar dinleyici, eğer serbest bırakılırsa basılırsa vb. Gibi yöntemlere sahiptir. JButton ile aynı şeyi yapmak istiyorum, Exp: Eğer kullanıcı fare ile tıklarsa ve tıklatılan pozisyonda fareyi tutarsa, kodun hangi yürütme işlemini yürütmesine kadar kod sona erecek.JButton Nasıl Kullanılır "Eğer basılırsa ve bırakılırsa"

Ne denedim? JButton'u ilk başta istediğim sonucu üretemedim çünkü JButton'un JToggleButton (JToggButton.getModel(). IsPressed()) ile oynadığı tam bir "tıklatma" gerektirmesi gerekiyor. Çalışırken, istediğiniz sonucu elde etmek için birisi bana doğru yönde işaret edebilir mi?

ÖZEL HEDEF:

ben, ben Mic içine konuşma bitirmek için hazır olana kadar Mikrofon ve ben klik basılı düzenleyeceği belirtildi düğmesi 'ni olacak ben inşa edilmiş bir mikrofon yöntemi kullanmak istiyorsanız, düşünmek Facebook'un parmağınızla mikrofonu nasıl tuttuğunu ve ses kaydını bıraktığınız zaman ses kaydının durduğunu, böylece 2 yöntem startLogic(); basıldığında ve basılı tutulduğunda ve stopLogic(); nihayet, kullanıcı bittiğinde serbest bırakıldığında

+0

Bir geçiş düğmesi istediğiniz gibi görünüyor. Neyi başarmaya çalıştığınıza dair daha iyi bir açıklama yapın ve kodunuzu gönderin. –

+2

[MouseListener] 'ı kullanmayı deneyin (https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseListener.html). – DistribuzioneGaussiana

+1

Tek yol: düğmenin ButtonModel'ına bir ChangeListener ekleyin. @DistribuzioneGaussiana: Bir fareListener, düğme, fare-çubuğu yolu ile ( –

cevap

6

Basit ama yanlış bir çözüm bir MouseListener kullanmaktır, çünkü bu dinleyici düğme depresyonuna yanıt vermediğinden, fare tuşuna basarsa ve bu tuşa basıldığında düğmeye basılıncaya kadar spacebar gibi fare dışındaki herhangi bir yolla.

Düğmenin ButtonModel'ını bir ChangeListener ile dinler ve isPressed() durumundaki değişiklikleri yanıtlarım. Bu, düğmeyi basarsa, fare veya boşluk çubuğu ne olursa olsun işe yarayacaktır. Örneğin:

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

Güzel gözlem. Çoğu insan bunu MouseListener ile yapardı. –

+0

Bence bu en iyi ihtiyaçlara uyacaktır, 1 + mouslistener'ı kullanmayı düşündüğüm için bunu ayarladığınız şekilde, ama uygun şekilde çalışmayacağını fark ettim, size öğretmek için cevabımı veriyorum. bugün bana bir şey :) – Sleeking