2017-09-21 14 views
0

私はかなりJavaに新しく、私は完全に自己がこの時点まで自分自身を教えています。Java:KeyListener Not working

今、私はJFrameクラスにKeyListenerを追加しようとしていますが、何が間違っているのか分からず、助けが必要です。その他のヒントは大歓迎です。

私のJFrameクラス:

import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.*; 

public class TestJavaFrame implements ActionListener, KeyListener { 
    private static JFrame frame = new JFrame(); 

    // Componenets 
    JLabel timeinmslabel = new JLabel("Enter the time in miliseconds:"); 

    JTextField timeinms = new JTextField(); 

    JRadioButton checkBox = new JRadioButton(); 
    JRadioButton checkBox2 = new JRadioButton(); 

    private boolean amountoftimes = false; 

    public TestJavaFrame(String windowname) { 
     frame.setName(windowname); 
     frame.setResizable(true); 
     frame.setSize(900, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(150, 50); 

     // JPanel 
     JPanel panel = new JPanel(); 
     panel.setLayout(null); 
     panel.setBounds(frame.getBounds()); 

     // Bounds for components 
     timeinmslabel.setBounds((int) (frame.getBounds().getX()/2), 125, 200, 25); 
     timeinms.setBounds((int) (frame.getBounds().getX()/2 + 185), 125, 200, 25); 
     checkBox.setBounds((int) (frame.getBounds().getX()/2 + 185), 40, 200, 25); 
     checkBox2.setBounds((int) (frame.getBounds().getX()/2 + 185), 70, 200, 25); 

     // Action Listeners 
     checkBox.addActionListener(this); 
     frame.addKeyListener(this); 

     // edit components 
     checkBox.setText("Use clicked amount of times."); 

     // add components 
     panel.add(timeinmslabel); 
     panel.add(timeinms); 
     panel.add(checkBox); 
     panel.add(checkBox2); 
     frame.add(panel); 

     frame.setVisible(true); 

    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println(e); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println(e.getKeyChar()); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     System.out.println(e.getKeyChar()); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     System.out.println(e.getKeyChar()); 
    } 
} 

あなたが私のメインが必要な場合は、私はそれを掲示すると完全に大丈夫だよ、それは今ないすべては、しかし、このGUIを作成することです。

+2

なぜ、KeyListenerをフレームに追加しますか?あなたの行動要件は何ですか?キーイベントは、フォーカスのあるコンポーネントにのみディスパッチされ、フレームにはフォーカスがありません。フレームのテキストフィールドにはフォーカスがあります。通常、キーバインディングを使用します。このページの右側にある「関連する」という見出しの下にあるフォーラムを検索するか、質問を読んでください。また、nullレイアウトは使用しないでください。 Swingはレイアウトマネージャで使用するように設計されています。 – camickr

+0

@camickrそのオートクリッカープログラムは、私が言ったように私はここで学ぶことを試みている。ユーザーが特定のキーを押すと、オートクリッカーが停止します。 JPanelにこのキーバインドを追加する必要がありますか? – Zachary

+0

'レイアウトをnullにしないのはなぜですか?' - レイアウト管理の仕組みを説明するチュートリアルのセクションがあります。 – camickr

答えて

1

したがって、ユーザーはそれがはいあなたがパネルにキーバインディングを追加することができ、オートクリッカーに

を停止し、特定のキーを打つとき。

より良いアプローチは、アプリケーションによるさまざまなアクションサポートのためのメニューバーを作成することです。その後、メニュー項目を使用して、クリッカーを開始/停止することができます。メニュー項目を作成すると、メニュー項目にアクセラレータを割り当てることができ、メニュー項目はキーバインディングを自動的に作成します。

"キーバインディング"はメニュー項目の一部であるため、自己文書化であるため、これはより良い解決策です。

詳細については、How to Use MenusのSwingチュートリアルのセクションを読んで開始してください。

私はここで学ぼうとしています。

すべてのSwingの基本については、このチュートリアルのリンクを参考にしてください。また、「キーバインディング」と「アクションの使用方法」のセクションもあります。

+0

レイアウトをnullに設定しないのはなぜですか? – Zachary