ユーザーがJTextFieldに何かを入力するまで、プログラムを「一時停止」します

hhaslam11

私は、Windowsコマンドプロンプトまたはターミナルと同様に機能するプログラムを作成しようとしています。これは基本的に、JTextAreaoutputinput。でJTextFieldが。のJFrameです。これは次のようになります。

ここに画像の説明を入力してください

プログラムが次のような文字列を返すメソッドを呼び出すたびに、JTextFieldから入力を取得できるようにしたいです。

public static String getInput() {
    //Wait for user to enter something, then press the enter key
}

エンターキーが押されたときに何かを実行できるようにAbstractActionを追加しましたが、メソッドを呼び出すたびに入力を文字列として返す方法を理解できました。

Action action = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {

        //Clears the JTextField
        input.setText("");

    }
};

私のような何か入れることができますuserInput = input.getText()ではpublic void actionPerformed()それだけで変数を設定しますので、毎回、使用に入ってきたものは何でも、userInput私がしたい時はいつでも、私は、ユーザーが画面上にいただきました!を読む時間を持ちたい、その後のためのプログラムウェイトを持っています彼らがすぐに入力した最後のものを使用するのではなく、応答。

私は次のuserInputような変数とブール変数を使おうとしました

private static String userInput = "";
private static boolean enterPressed = false;

Action action = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {

        userInput = input.getText()
        enterPressed = true;
        input.setText("");

    }
};

...

public static String getInput() {

    enterPressed = false;
    while(!enterPressed){
       //Do Nothing
    }
    enterPressed = false;
    return userInput;

}

私が電話したときoutput.setText(getInput());、それwhile(!enterPressed){}は私のプロセッサを必要以上に難しくしたことを除いて、私が望んでいたように機能しました。これを行うには、おそらくもっと良い方法があると確信しています。

これが今の私のコード全体です:

public class ConsoleFrame {

//Objects for Console Frame
JFrame frame = new JFrame();
JTextArea output = new JTextArea();
JTextField input = new JTextField();
BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
JScrollPane scrollPane = new JScrollPane(output);
DefaultCaret caret = (DefaultCaret)output.getCaret();
Action action = new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e) {

        input.setText("");

    }
};
ConsoleFrame(){
    input.addActionListener(action);
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    frame.setLayout(boxLayout);
    frame.add(scrollPane);
    frame.add(input);
    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 250);
    frame.setLocationRelativeTo(null);
    input.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
    output.setEditable(false);
    output.setAutoscrolls(true);
}
public static String getInput() {
    return null;
}

}

では、ユーザーがEnterキーを押すまで、電話をかけるたびにプログラムを停止するにはどうすればよいgetInput();でしょうか。

MadProgrammer

プログラムが次のような文字列を返すメソッドを呼び出すたびに、JTextFieldから入力を取得できるようにしたいです。

エンターキーが押されたときに何かを実行できるようにAbstractActionを追加しましたが、メソッドを呼び出すたびに入力を文字列として返す方法を理解できました。

public String getInput() {
    return input.getText();
}

では、getInput();を呼び出すたびに、ユーザーがEnterキーを押すまで、プログラムを停止するにはどうすればよいでしょうか。

あなたはしません。Swingは、ほとんどのUIフレームの動作と同様に、イベント駆動型です。つまり、何かが発生し、それに応答します。

したがって、そのことを念頭に置いて、ある種のオブザーバーパターンの使用を検討する必要があります。このパターンでは、コールバックを使用してActionListener、たとえば、関心のあるある種の変更を通知します

代わりに、関係者が登録し、フィールドが変更されたときに通知する、ある種のリスナーを提供することができます。

import java.util.EventListener;
import java.util.EventObject;

public class InputEvent extends EventObject {

    private final String text;

    public InputEvent(Object source, String text) {
        super(source);
        this.text = text;
    }

    public String getText() {
        return text;
    }

}

public interface InputObsever extends EventListener {

    public void inputChanged(InputEvent evt);

}

これで、入力が変更/更新されるたびに通知されるオブザーバーができました。

次に、イベントを登録解除/登録して起動する方法が必要です...

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.EventListenerList;
import javax.swing.text.DefaultCaret;

public class ConsoleFrame {

//Objects for Console Frame
    JFrame frame = new JFrame();
    JTextArea output = new JTextArea();
    JTextField input = new JTextField();
    BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS);
    JScrollPane scrollPane = new JScrollPane(output);
    DefaultCaret caret = (DefaultCaret) output.getCaret();
    Action action = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {

            fireInputChanged(input.getText());
            input.selectAll();

        }
    };

    private EventListenerList listenerList = new EventListenerList();

    ConsoleFrame() {
        input.addActionListener(action);
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        frame.setLayout(boxLayout);
        frame.add(scrollPane);
        frame.add(input);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 250);
        frame.setLocationRelativeTo(null);
        input.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
        output.setEditable(false);
        output.setAutoscrolls(true);
    }

    public String getInput() {
        return input.getText();
    }

    public void addInputObsever(InputObsever obsever) {
        listenerList.add(InputObsever.class, obsever);
    }

    public void removeInputObsever(InputObsever obsever) {
        listenerList.remove(InputObsever.class, obsever);
    }

    protected void fireInputChanged(String text) {

        InputObsever[] listeners = listenerList.getListeners(InputObsever.class);
        if (listeners.length > 0) {

            InputEvent evt = new InputEvent(this, text);
            for (InputObsever obsever : listeners) {
                obsever.inputChanged(evt);
            }

        }

    }

}

ここでのポイントは、テキストがいつ入力/変更されたかを知りたい場合は、オブザーバーをインスタンスに登録することです。 ConsoleFrame

console.addInputObsever(new InputObsever() {
    @Override
    public void inputChanged(InputEvent evt) {
        // Do what ever you need to do...
    }
});

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Qt-ユーザー入力を待つためにプログラムの実行を一時停止する正しい方法は何ですか?

分類Dev

Javaユーザーがコマンドプロンプトに入力を入力するまでプログラムの実行を停止します

分類Dev

ユーザーがnを入力してプログラムを終了するまで、プログラムを実行し続けたいですか?

分類Dev

ユーザー入力が終了するまでプログラムを実行し続けます

分類Dev

EditTextでのユーザー入力を無効にしますが、プログラムによる入力は許可します

分類Dev

JFrameクラスを呼び出すときにJavaプログラムがユーザー入力を一時停止しない

分類Dev

ユーザーがテキストフィールドへの入力を一時停止してからコールバックを実行するまで待機するJSプラグインまたはjQuery関数を探しています

分類Dev

ユーザーが正しいユーザー名とパスワードを入力するまでプログラムをループさせる方法

分類Dev

scanner.nextLine()は、ユーザーが1-2を入力するとエラーになります。プログラムがこの入力を1として受け入れるようにするにはどうすればよいですか?

分類Dev

ユーザーが入力を続けるまでプログラムを実行するにはどうすればよいですか?

分類Dev

一連の単語をユーザーに照会するJavaプログラムを作成します。ユーザーが「quit」と入力すると、プログラムは終了します。

分類Dev

6人を超えるユーザーの値を入力すると、プログラムが動作を停止します

分類Dev

ユーザーが入力した数値の積、ユーザーが0を入力するとプログラムが停止する

分類Dev

ユーザーからの入力を取得するプログラムを作成すると、特定の入力ごとに特定の出力が得られます

分類Dev

ユーザーが単語を入力するまで実行を続けるプログラム

分類Dev

プログラムがユーザーにプロンプトを表示する前にユーザー入力を受け取るのはなぜですか?

分類Dev

私は質問を繰り返したいが、ユーザが入力した場合-1私は停止にプログラムをしたいですか?

分類Dev

ユーザーが「q」を入力すると、プログラムは終了します

分類Dev

ユーザーが無効な入力を入力した場合、どうすればプログラムを終了できますか?

分類Dev

ユーザーがCでCtrl + dを入力したときにプログラムを終了する

分類Dev

私のコードの何が問題になっていますか?文字列を入力すると、プログラムが動作を停止します。文字列を入力してもプログラムを動作させ続けるにはどうすればよいですか

分類Dev

ユーザー入力 20 をプログラムで 20% または 0.20 として読み取るにはどうすればよいですか

分類Dev

ユーザー入力が偶数か奇数かを判断するプログラムを作成し、ループします

分類Dev

ユーザー入力を取得するまでループを一時停止するにはどうすればよいですか?

分類Dev

私のボットプログラムはユーザー入力を受け入れ、返信する代わりに何もしません

分類Dev

ユーザーが単語を入力してプロセスを停止するまで出力を継続的に出力するループを作成する

分類Dev

ユーザー入力を一時停止しますが、X秒後に続行します

分類Dev

ユーザーが209,312,414と入力すると、プログラムを停止する必要があります

分類Dev

プログラムへの入力が指示されているのか、isatty関数を使用してユーザーの入力にすぎないのかをどのように区別できますか?

Related 関連記事

  1. 1

    Qt-ユーザー入力を待つためにプログラムの実行を一時停止する正しい方法は何ですか?

  2. 2

    Javaユーザーがコマンドプロンプトに入力を入力するまでプログラムの実行を停止します

  3. 3

    ユーザーがnを入力してプログラムを終了するまで、プログラムを実行し続けたいですか?

  4. 4

    ユーザー入力が終了するまでプログラムを実行し続けます

  5. 5

    EditTextでのユーザー入力を無効にしますが、プログラムによる入力は許可します

  6. 6

    JFrameクラスを呼び出すときにJavaプログラムがユーザー入力を一時停止しない

  7. 7

    ユーザーがテキストフィールドへの入力を一時停止してからコールバックを実行するまで待機するJSプラグインまたはjQuery関数を探しています

  8. 8

    ユーザーが正しいユーザー名とパスワードを入力するまでプログラムをループさせる方法

  9. 9

    scanner.nextLine()は、ユーザーが1-2を入力するとエラーになります。プログラムがこの入力を1として受け入れるようにするにはどうすればよいですか?

  10. 10

    ユーザーが入力を続けるまでプログラムを実行するにはどうすればよいですか?

  11. 11

    一連の単語をユーザーに照会するJavaプログラムを作成します。ユーザーが「quit」と入力すると、プログラムは終了します。

  12. 12

    6人を超えるユーザーの値を入力すると、プログラムが動作を停止します

  13. 13

    ユーザーが入力した数値の積、ユーザーが0を入力するとプログラムが停止する

  14. 14

    ユーザーからの入力を取得するプログラムを作成すると、特定の入力ごとに特定の出力が得られます

  15. 15

    ユーザーが単語を入力するまで実行を続けるプログラム

  16. 16

    プログラムがユーザーにプロンプトを表示する前にユーザー入力を受け取るのはなぜですか?

  17. 17

    私は質問を繰り返したいが、ユーザが入力した場合-1私は停止にプログラムをしたいですか?

  18. 18

    ユーザーが「q」を入力すると、プログラムは終了します

  19. 19

    ユーザーが無効な入力を入力した場合、どうすればプログラムを終了できますか?

  20. 20

    ユーザーがCでCtrl + dを入力したときにプログラムを終了する

  21. 21

    私のコードの何が問題になっていますか?文字列を入力すると、プログラムが動作を停止します。文字列を入力してもプログラムを動作させ続けるにはどうすればよいですか

  22. 22

    ユーザー入力 20 をプログラムで 20% または 0.20 として読み取るにはどうすればよいですか

  23. 23

    ユーザー入力が偶数か奇数かを判断するプログラムを作成し、ループします

  24. 24

    ユーザー入力を取得するまでループを一時停止するにはどうすればよいですか?

  25. 25

    私のボットプログラムはユーザー入力を受け入れ、返信する代わりに何もしません

  26. 26

    ユーザーが単語を入力してプロセスを停止するまで出力を継続的に出力するループを作成する

  27. 27

    ユーザー入力を一時停止しますが、X秒後に続行します

  28. 28

    ユーザーが209,312,414と入力すると、プログラムを停止する必要があります

  29. 29

    プログラムへの入力が指示されているのか、isatty関数を使用してユーザーの入力にすぎないのかをどのように区別できますか?

ホットタグ

アーカイブ