2

GUI を介してユーザーに関連情報 (紹介、はい/いいえの質問、その他の質問など) を表示する必要があります。ユーザーはコンソールに応答を入力します。しかし、私は一生、これを行う方法を考えたり見つけたりすることはできません。GUI を実行しながらコンソールへの入力を許可するにはどうすればよいですか? これは、私がやろうとしていることを示すいくつかのカットダウンコードです。私はコンテナのものを扱うppsフレームクラスからこれをやっています。ボタン、テキスト フィールド、および後でアクション イベントを追加するだけです。

public class gui extends XFrame
{
    private JTextField[] textFieldsUneditable;

        public gui()
        {
            super();
            textFieldsUneditable = new JTextField[10];
            for(int i=0; i<textFieldsUneditable.length; i++)
            {
                textFieldsUneditable[i] = new JTextField(42);
                textFieldsUneditable[i].setEditable(false);
                add(textFieldsUneditable[i]);
            }

            revalidate();
            repaint();
        }

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            // code code code
        }

しかし、私が持っているのは他のメソッドであり、ユーザーがコンソールで応答した後、GUI で setText を使用して実行し、これらの編集不可能な JTextField に出力したいと考えています。それが理にかなっていることを願っています!

4

1 に答える 1

0

私はこのようなことをします(以下の例):

  1. GUIを作成し、更新するフィールドへの参照を保存します
  2. を使用して、コンソール入力を1行ずつ取得しScannerます。
  3. 更新するフィールドを見つけます
  4. SwingUtilities.invokeAndWaitまたはを使用してスレッドセーフな方法を使用して更新しますinvokeLater
  5. 完了するまで3と4を繰り返します。

public static void main(String[] args) throws Exception {

    // create a new frame
    JFrame frame = new JFrame("Test");
    frame.setLayout(new GridLayout(0, 1));

    // create some fields that you can update from the console
    JTextField[] fields = new JTextField[10];
    for (int i = 0; i < fields.length; i++)
        frame.add(fields[i] = new JTextField("" + i)); // add them to the frame

    // show the frame (it will pop up and you can interact with in - spawns a thread)
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    // Create a scanner so that you can get some input from the console (the easy way)
    Scanner s = new Scanner(System.in);

    for (int i = 0; i < fields.length; i++) {

        // get the field you want to update
        final JTextField field = fields[i];

        // get the input from the console
        final String line = s.nextLine();

        // update the field (must be done thread-safe, therefore this construct)
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override public void run() { field.setText(line); }
        });
    }
}
于 2012-05-21T11:16:40.090 に答える