0

私は2つのクラスを持っています。1.1 つのクラスには、Netbeans GUI ビルダーによって生成されたすべての GUI コードが含まれます (GUI クラスと呼びます)。2.別のクラスには、メソッド (SwingWorker を拡張する SaveTraffic) を含むいくつかのコードが含まれます。

私の SaveTraffic では、アプリケーションを実行するとポップアップして GUI の前に来るフレームを作成します。このフレームを配置したい特定の場所で GUI に追加したいと考えています。これはどのように可能ですか?これはSaveTrafficの私のコードです

public class SaveTraffic extends SwingWorker<Void, String> {

    public static int k = 0;
    public GUI f = new GUI();
    public static Frame u = new Frame();
    public static JTextArea h = new JTextArea();
    JScrollPane scrollPane2 = new JScrollPane(h, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    @Override
    public Void doInBackground() throws IOException {
        u.setSize(950, 200);
        u.setLocation(0,550);
        u.add(scrollPane2);
        u.setVisible(true);
        while (f.num() != 2) {
            {
              publish("Hello World");
            }
        }
        return null;
    } //end main function

    @Override
    public void process(List<String> chunks) {
        for (final String text : chunks) {
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    h.setLineWrap(true);
                    h.append(text + "\n");
                }
            };
            new Thread(r).start();
        }
    }

    @Override
    public void done() {
        System.out.println("I am DONE");

    }
}
4

3 に答える 3

2

コードにいくつかの問題があります。

  1. 新しいフレームではなく、JDialogを探しています。正しいダイアログ所有者を JDialog のコンストラクターに渡すようにしてください。ダイアログがモーダルかどうかは、コンストラクターのパラメーターを介して、または を呼び出すことによって選択できますsetModal()
  2. SwingWorker.publish メソッド内で新しいスレッドを開始しています。これらのスレッドは UI を変更します。JTextArea.append はスレッドセーフですが、複数のスレッドを使用して JTextArea を更新することはありません。これは不必要であり、いつかスレッドセーフではない呼び出しを追加すると、デッドロックが発生します。
  3. コンポーネントをフレームに追加し、そのサイズを設定して、EDT で実行されない SwingWorker.doInBackground() で表示できるようにします。代わりに、EDT 内で SwingWorker を実行する前にその呼び出しを移動します。
  4. テキストエリアで行の折り返しを常に true に設定する必要はありません。一度呼び出すだけで十分です。
  5. 「k」が何に使用されるかはわかりませんが、静的変数には注意してください。
  6. Frame と TextArea を静的にするのはなぜですか?

(オプション) SaveTraffic にコンストラクターを追加し、そこでほとんどのコードを初期化することも検討します。

于 2012-05-21T18:09:18.193 に答える
2
  • メソッドSwing Gui内に構築しないでください。既に存在する値に指定されていますSwingWorker'sSwingWorkeradd / modify / changeJComponent(s)

  • process()にまたはpublish()を追加しSwingWorkerます。このメソッド内で、JTextArea定期的に値を入力するか、テキストを追加します

  • 「モニタリング」SwingWorker'sステータスの場合は、 PropertyChangeListenerを追加します

  • 簡単な例

于 2012-05-21T18:12:48.423 に答える
0

JPanel を拡張するクラスを作成します。次に、そこですべてのコードを実行し、それをメソッド クラスにバインドします。

于 2012-05-21T17:36:22.293 に答える