3

私は Swing を初めて使用するので、これは非常に素朴な質問のように思えるかもしれません。

初期ステートメントと 2 つのラジオボタンを表示する JFrame があります。RadioButton1 は Accept で、RadioButton2 は Reject です。ユーザーが Accept を選択すると、プログラムは続行します。したがって、Accept 用の ActionListener を作成して、残りのコードがこの ActionListener 内に収まるようにしました。ただし、ユーザーが Accept を押すとすぐに、GUI がフリーズします。拒否を押すことは、プログラムの外にあるだけです。

    public void game() throws Exception
    {
        jTextArea1.setLineWrap(true);
        jTextArea1.setWrapStyleWord(true);
        jTextArea1.setText("Please choose Accept or Reject");


        jRadioButton1.setVisible(true);
        jRadioButton2.setVisible(true);

            jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {

              jRadioButton1.setVisible(false);
              jRadioButton2.setVisible(false);
              repaint();
             //more code
           });
    }

この後、 System.out.println() を使用すると、すべての出力が正常に動作し、GUI だけがフリーズするため、サーバーに接続します。

ユーザーが Accept を押したときに続行するより良い方法はありますか?

4

2 に答える 2

6

SwingWorker クラスを使用して見ることができます。

基本的に、Java Swing アプリケーションはシングル スレッドであり、実行するプロセス集約型のタスクがある場合、制御はコードのそのセクションに転送され、UI はハングし、制御が返されるのを待ちます。

編集: SwingUtilities クラスを調べることもできます。

編集: SwingWorker クラスの使用に関する基本情報:

SwingWorker を拡張してメソッドを実装する新しいクラスを作成できます public String doInBackground() { /*Do Stuff here*/ }。ActionListener イベントで、SwingWorker のインスタンスを作成し、メソッドを呼び出してswingWorkerObject.execute()doInBackground メソッドの実行を開始します。

詳細はこちら: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

于 2012-10-25T03:53:13.307 に答える
2

必要最小限の GUI 更新のみをイベント処理に配置し、残りの非 GUIについては s を使用しますThread
ちなみに のrepaint後に no は必要ありませんsetVisible

于 2012-10-25T03:53:01.290 に答える