2013-03-29 50 views
0

首先,我的程序很簡單。我只需要點擊或按Alt +輸入JButton來遞增計數器。如何在按住按鈕時執行JButton?

這裏的程序,所以你可以嘗試一下:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class holdDownClass implements ActionListener { 
    private static JButton exebouton; 
    private JTextArea ecran = new JTextArea(); 
    private JScrollPane scrollecran = new JScrollPane(ecran); 
    private int counter = 0; 

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

    private holdDownClass() { 
     // Window 
     JFrame frame = new JFrame("Name"); 
     frame.setBounds(400, 350, 625, 355); 
     frame.setLayout(null); 

     Container container = frame.getContentPane(); 

     // Panel 
     JPanel panneau = new JPanel(); 
     panneau.setLayout(null); 
     panneau.setBounds(2, 42, 146, 252); 
     frame.add(panneau); 

     JLabel nglabel = new JLabel("Click or Press Alt+Enter"); 
     nglabel.setBounds(5, 0, 200, 20); 
     panneau.add(nglabel); 

     // Button 
     exebouton = new JButton("Execute"); 
     exebouton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter 
     exebouton.setBounds(4, 18, 138, 47); 
     exebouton.addActionListener(this); 
     panneau.add(exebouton); 

     // Text Area 
     ecran.setEditable(true); 
     scrollecran.setBounds(150, 42, 467, 252); 
     container.add(scrollecran); 

     // Show 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object test = e.getSource();   
     if (test.equals(exebouton)) { 
      counter += 1; 
      ecran.setText(ecran.getText() + counter + "\n"); 
     } 
    } 
} 

我的目標是:與其重複按下Alt + Enter鍵,我想按住Alt + Enter鍵遞增計數器「更快」。

+0

你嘗試處理鼠標按下和鼠標釋放事件。按下鼠標時開始遞增,釋放鼠標時開始遞增。 –

+0

@Sudhanshu我沒有嘗試。我不知道如何去做。我該怎麼做? –

+0

爲你將不得不KeyListener的註冊到''JButton''exebouton –

回答

1

這裏是你可以做它 -

private boolean mousePressed; 

的方式和鼠標listener-

 exebouton.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      mousePressed = true; 
      new Thread() { 
       public void run() { 
        while (mousePressed) { 
         counter += 1; 
         ecran.setText(ecran.getText() + counter + "\n"); 
        } 
       } 

      }.start(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      mousePressed = false; 
     } 

    }); 

就是這樣。

+1

點對點答案,但圖形組件的更改應該可能在EDT上完成。使用'SwingUtilities.invokeLater'或者使用'SwingUtilities.isEventDispatchThread()'檢查。 –

+1

或者使用一個Swing'Timer' – MadProgrammer

2

您可以使用MouseListener,但個人而言,我覺得這不是實現您試圖達到的目標的最合適方法,因爲它會與按鈕的運作發生衝突。

相反,你可以附加一個變化監聽器按鈕模型,而按鈕的狀態保持按下,循環一個Swing Timer ....

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

public class TestButton04 { 

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

    private int counter = 0; 
    private Timer trigger; 
    private JButton btn; 

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

       btn = new JButton("0"); 
       trigger = new Timer(125, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         counter++; 
         btn.setText(String.valueOf(counter)); 
        } 
       }); 
       trigger.setCoalesce(true); 
       trigger.setRepeats(true); 

       btn.getModel().addChangeListener(new ChangeListener() { 
        @Override 
        public void stateChanged(ChangeEvent e) { 
         if (btn.getModel().isPressed()) { 
          trigger.start(); 
         } else { 
          trigger.stop(); 
         } 
        } 
       }); 

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

     }); 
    } 
} 
+0

你可以使用一個......,從來沒有使用的MouseListener JButton的 – mKorbel

+0

你知道爲什麼設置在JLabel的「滯後」的文本?即使當我在計時器上放置了500毫秒的延遲... – dguay

+0

你是否將它設置爲EDT?你是否阻止了EDT? – MadProgrammer