0

Swing アプリでは、ユーザーが正解を入力した後にのみメソッドを続行する必要があります。正解は に格納され、Stringユーザーの回答はリスナーによって別の に設定されますString。したがって、コードは

while (!correctAnswer.equals(currentAnswer)) {
     // wait for user to click the button with the correct answer typed into the textfield
}
// and then continue

このアプローチですべて問題ありませんか、それとも何らかの方法でリファクタリングしますか? CPUに余分なペナルティを課しませんか? これはやや似た質問です。

4

5 に答える 5

6

他の人が示唆しているように、ボタンが押されたときに呼び出されるリスナーをボタンに割り当てます。

ボタンが押されたときに呼び出されるメソッドの使用方法ActionListenerと実装方法を示す不完全な例を次に示します。actionPerformed

...
final JTextField textField = new JTextField();
final JButton okButton = new JButton("OK");
okButton.addActionListner(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        if ("some text".equals(textField.getText()))
            System.out.println("Yes, text matches.");
        else
            System.out.println("No, text does not match.");
    }
});
...

ボタンとテキスト フィールドが存在するクラスに実装したいだけActionListenerなので、2 つのオブジェクトを として宣言する必要はありませんfinal。(例を短くするために、匿名の内部クラスを使用しました。)

詳細については、 The Java Tutorials のHow to Write an Action Listener を参照してください。

また、Java でイベントがどのように機能するかについての一般的な情報については、Java チュートリアルのレッスン: イベント リスナーの作成が役立つ場合があります。

編集: Shiny 氏と New のコメントからの提案に従って、 if wasを防ぐためにifステートメント内の式をtextField.getText().equals("some text")toに変更しました。"some text".equals(textField.getText())NullPointerExceptiontextFieldnull

于 2008-12-02T14:42:20.130 に答える
5

UIプログラミングは初めてですか?私が尋ねる理由は、あなたの答えが手続き型のコーディング スタイルに基づいているためです。これは UI の目的ではありません。イベント駆動型の傾向があります。

この場合、解決策は非常に簡単です。イベント リスナー ( ActionListener) を送信ボタンに追加し、そこで結果を確認します。問題がなければ、次に進みます。そうでない場合は、そう言って、もう一度試してもらいます。

于 2008-12-02T14:19:11.660 に答える
2

私はそこにロジックを理解していないと思いますが、古い基本時代を思い出させます. .

タイピングはリスナーによって観察されます。では、そこでテストをしてみませんか?イベントを待機するループを実行しないでください。Java に実行させてください (およびその他の処理を行います)。必要に応じて、ロジックを 2 つに分割し、正しい入力がリスナーに与えられていることを検出したら、2 番目の部分に進みます。

これが理にかなっているといいのですが... ;-)

于 2008-12-02T14:18:29.710 に答える
2

はい、ここで皆さんがおっしゃる通りです。

GUI アプリの場合、ユーザー入力を処理する最善の方法は、イベントが発生するのを待つことです。

次に、メソッドを使用して入力を検証し、成功した場合はフローを続行して、別のページに移動できます。

ユーザー入力を検証し、成功した場合は何らかのアクションを実行するログイン画面の完全な (まだ単純な) 例を次に示します。

このコードには、この概念がどのように適用されるかを完全に実行可能なサンプルで示す以外に価値はありません 。

シンプルな GUI http://img229.imageshack.us/img229/1532/simplenz0.png

// * used for brevity. Preffer single class per import
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;


public class MatchString{

    private final JTextField password;
    private final JFrame frame;

    public static void main( String [] args ){
        MatchString.show();
    }

    public static void show(){
        SwingUtilities.invokeLater( new Runnable(){
            public void run(){
                new MatchString();
            }
        });
    }

    private MatchString(){
        password = new JPasswordField( 20 );
        frame = new JFrame("Go to www.stackoverflow");
        init();
        frame.pack();
        frame.setVisible( true );
    }


    private void init(){

        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        frame.add( new JPanel(){{
            add( new JLabel("Password:"));
            add( password );
        }});

        // This is the key of this question.
        // the password textfield is added an 
        // action listener
        // When the user press enter, the method 
        // validatePassword() is invoked.
        password.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                validatePassword();
            }
        });
    }


    private void validatePassword(){            
        // If the two strings match
        // then continue with the flow
        // in this case, open SO site.    
        if ( "stackoverflow".equals(password.getText())) try {
            Desktop.getDesktop().browse( new URI("http://stackoverflow.com"));
            frame.dispose();
        } catch ( IOException ioe ){
            showError( ioe.getMessage() );
        } catch ( URISyntaxException use ){
            showError( use.getMessage() );
        } else {
            // If didn't match.. clear the text.
            password.setText("");
        }
    }
 }
于 2008-12-03T03:00:23.790 に答える
0

文字列が GUI レートで人間のユーザーから来ている場合、パフォーマンスを最適化してもほとんど意味がありません。人間はおそらく 1 秒間に 1 ~ 3 個の文字列しか入力できませんが、それは機械にとっては何の意味もありません。

この特定のケースでは、テストする入力を取得するために何かをする必要があるため、do-whileループを使用することをお勧めします。

于 2008-12-02T14:18:07.590 に答える