2

テキストフィールドがあり、フォーカスが失われると入力が検証され、渡されなかった場合はエラーメッセージが出力されます(ここでは単純に空のチェックがあります)。テキストフィールドの横にボタンがあり、クリックするとテキストが印刷されます。

私が試したように、テキストを入力してボタンをクリックすると、テキストフィールドのフォーカスロストイベントとボタンのイベントの両方がトリガーされます。つまり、最初に検証を行い、次に入力テキストを出力します。

ここで私の質問があります。検証に合格しなかった場合にテキストを印刷しないようにする良い方法は何ですか? または、検証に合格しなかった場合にボタンのクリックイベントを「無視」する方法はありますか?

検証結果を示すブール値フラグを使用して、ボタンのアクションを実行するときにフラグをチェックしようとしましたが、それは良いアプローチではないと思います。イベントを処理するイベント ディスパッチャー スレッドが Swing にあることは知っていますが、ここからイベントをキャンセルすることはできますか?

以下は、質問を説明するコードです。

public class SimpleDemo
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel content = new JPanel(new FlowLayout());
        frame.setContentPane(content);

        final JTextField textField = new JTextField(10);
        textField.addFocusListener(new FocusAdapter()
        {
             @Override
             public void focusLost(FocusEvent e)
             {
                 String text = textField.getText();
                 // do some validation here, if not validated 
                 // do not trigger the event on button.
                 if ("".equals(text))
                 {
                     System.out.print("please input a text!");
                 }
             }
        });
        content.add(textField);

        JButton button = new JButton("Print Text");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                // action performed for button
                String text = textField.getText();
                System.out.println(text);
            }
        });
        content.add(button);

        frame.setVisible(true);
        frame.pack();
    }
}
4

3 に答える 3

1

アプリケーションの作業中に同様の問題に直面します。ApplicationFrame以下のように解決しましたアプリケーションのすべてのフレームが拡張する抽象クラスを作成しました

public abstract class ApplicationFrame extends JFrame implements ActionListener {
    @Override
    final public void actionPerformed(ActionEvent event) {
        if(validateInput()){
             performAction(event);
        }
    }

    /*
    * Sub class should override this method to receive any action
    */
    protected void performAction(ActionEvent event) {};

    /*
     * Sub class should override this method to perform validation
    */
    abstract protected boolean validateInput();
}

以下のように、すべてのフレームがこの基本フレームを拡張します。

public class Frame1 extends ApplicationFrame{
    @Override
    protected void performAction(ActionEvent event) {
        // perform action
    }
    @Override
    protected boolean validateInput() {
        // return true or false depending upon the validation results
    }
    // if you want to add Action Listener, you need to add like this:
    btnSomeButton.addActionListener(this);
}

フォーカス イベントを処理する必要がある場合は、ApplicationFrameまたはベース フレームを実装することができますFocusListener。これは問題を解決するための私のカスタム実装です。これが役立つことを願っています。

于 2013-03-28T09:12:17.457 に答える
0
  • 起動時にボタンを無効にする
  • フォーカスが失われると、入力が検証に合格した場合にのみ、テキストと有効化ボタンを検証します。
  • テキスト変更の開始時に、ボタンを無効にします
于 2013-03-28T09:16:35.277 に答える
0

ユーザーと通信するための ui を作成することは常に理にかなっています。したがって、ユーザーが何も入力しない場合、textField のデフォルトのテキストとして「テキストを入力してください」と表示できます。このようなカスタム textField のコードは次のとおりです。

public class TextFieldWithDefaultText extends JTextField implements FocusListener{

private final String hint;

public TextFieldWithDefaultText (String $text)
{
    super($text);
    this.hint = $text;
    addFocusListener(this);
}

@Override
public void focusGained (FocusEvent $e)
{
    if (this.getText().isEmpty())
    {
        super.setText("");
    }
}

@Override
public void focusLost (FocusEvent $e)
{
    if (this.getText().isEmpty())
    {
        super.setText(hint);
    }
}

@Override
public String getText ()
{
    String typed = super.getText();
    return typed.equals(hint) ? "" : typed;
}

}

ボタンの actionListerner を次のように記述します。

JButton button = new JButton("Print Text");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if(!textField.getText().isEmpty())
                System.out.println(textField.getText());
        }
    });

そして、あなたの textField 実装は次のようになります:

final TextFieldWithDefaultText textField = new TextFieldWithDefaultText ("please input a text");

お役に立てれば :)

于 2013-03-28T11:23:26.413 に答える