JTextFieldでエンタープレスを検出する


103

EnterJavaでJTextFieldを入力しているときに誰かが押すと検出できますか?ボタンを作成してデフォルトとして設定する必要はありません。

回答:


168

A JTextFieldはそのままの状態で使用するActionListenerように設計されていますJButton。のaddActionListener()方法を参照してくださいJTextField

例えば:

Action action = new AbstractAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("some action");
    }
};

JTextField textField = new JTextField(10);
textField.addActionListener( action );

これで、Enterキーが使用されたときにイベントが発生します。

また、ボタンをデフォルトのボタンにしたくない場合でも、リスナーをボタンと共有できるという利点もあります。

JButton button = new JButton("Do Something");
button.addActionListener( action );

注、この例では、使用してAction、どの道具ActionListenerためのAction追加機能を備えた新しいAPIです。たとえばAction、テキストフィールドとボタンの両方のイベントを無効にするを無効にすることができます。


1
同意した。一般的なケースでは、私よりもエレガントなソリューションです。
Kos

@camickrはJava Swingのエキスパートです
Mohamed Iqzas 2017年

23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

上記のように、JTextFieldにaddActionListenerを実行するだけです。Enterアクションを押すと、ステートメントで必要なアクションが実行されます。


16

のイベントを追加しKeyPressedます。

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 

-1 :( Swingの観点からKeyListenersは低すぎるレベル
です。Swingで

1
@nIcEcOw KeyListenersは、Swingの観点からは低すぎるレベルです:引用が必要です。
guido

2
@ᴳᵁᴵᴰᴼ:非常によく文書化されたもの、KeyBindingsの公式チュートリアルで見つけることができますが、stackoverflowの非常に良い答えも同じ側面をカバーしています:-)
nIcE cOw

1
@nIcEcOwそれはまさに私が考えていたドキュメントページです。私はショートカットとアクションのバインディング優先することを提案することと、低レベルキーボードを制御するためにリスナーのみを使用することと、間違ったAPIであるため使用しないこととの間に多くの違いを見つけます。ドキュメントページも白黒ではありません。
guido 2015年

1
@ᴳᵁᴵᴰᴼ:フォーカス関連、コピー/貼り付け関連などKeyListeners、多くの欠点があり、によって大幅に対処され KeyBindingsます。OPで要求されるような簡単なタスクの場合は、回避する必要があります。
nIcE COW 2015年

9

このようなことをしたいですか?

JTextField mTextField = new JTextField();
    mTextField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                // something like...
               //mTextField.getText();
               // or...
               //mButton.doClick();
            }
        }

    });

1

最初に、JButtonまたはJTextFieldにアクションコマンドを追加します。

JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");

次に、ActionListenerをJTextFieldとJButtonの両方に追加します。

JButton.addActionListener(listener);
JTextField.addActionListener(listener);

その後、あなたのActionListener実装に

@Override
public void actionPerformed(ActionEvent e)
{
    String actionCommand = e.getActionCommand();

    if(actionCommand.equals("Your actionCommand for JButton") || actionCommand.equals("Your   actionCommand for press Enter"))
    {
        //Do something
    }
}

1

他の回答(承認された回答を含む)は良いですが、すでにJava8を使用している場合は、次のことを(短くて新しい方法で)行うことができます。

textField.addActionListener(
    ae -> {
        //dostuff
    }
);

受け入れられた答えが言ったようにActionListener、Enterキーをキャッチすると単に反応することができます。

ただし、私のアプローチでは、Java 8で導入された機能の概念を利用しています。

たとえばボタンとJTextFieldに同じアクションを使用したい場合は、以下を実行できます。

ActionListener l = ae -> {
    //do stuff
}

button.addActionListener(l);
textField.addActionListener(l);

さらに説明が必要な場合は、お知らせください!


0

JTextField Enterでデフォルトのボタンアクションを設定する場合は、次のようにする必要があります。

//put this after initComponents();

textField.addActionListener(button.getActionListeners()[0]);

ボタンは多くのアクションを持つことができるので[0]ですが、通常は1つだけです(ActionPerformed)。


0

フレーム内の各テキストフィールドについて、addKeyListenerメソッドを呼び出します。次に、keyPressedメソッドを実装してオーバーライドします。これで、フレームの任意のフィールドからEnterキーを押して、アクションをアクティブ化できます。

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

-2
public void keyReleased(KeyEvent e)
{
    int key=e.getKeyCode();
    if(e.getSource()==textField)
    {
        if(key==KeyEvent.VK_ENTER)
        { 
            Toolkit.getDefaultToolkit().beep();
            textField_1.requestFocusInWindow();                     
        }
    }

で「Enter Press」のロジックを作成JTextFieldするにはkeyReleased()keyTyped()&の代わりにロジックをブロック内に保持することをお勧めしkeyPressed()ます。


1
-1 :(以前の回答ですでに反対投票された同じ間違いを繰り返すために、同じことの指定された理由と同様です。の観点KeyListenersからは低すぎるレベルSwingです。意図されているAPIを使用してくださいとともに使用Swing :-)
nIcE cOw 2013

-3

このコードを使用してください:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.