2

XMLファイルを(継続的に)解析し、GUIにデータを表示するアプリケーションを作成しています( Swing)。はParseThreadCoreProjectあり、GUIはにありGUIProjectます。

の先頭は、ItemListenerを使用してにParseThread接続されています。JCheckBoxMenuItemの値はsetSelected()、メニューに追加した直後に設定されます。現時点では、GUIには、解析されたデータを表示するために必要なComponentものは含まれていません。ParseThread

私の解決策は、ParseThreadGUIが完全にビルドされるまで待つ必要があるということです。EventQueueのようなものを考えましたが、コーディング方法がわかりません。

4

2 に答える 2

3

私の解決策は、ParseThreadはGUIが完全にビルドされるまで待機する必要があるということです。EventQueueのようなものを考えましたが、コーディング方法がわかりません。

Swingの同時実行性に問題があります。ハードで長時間実行されるタスクは、バックグラウンドタスクに移動する必要があります。Swingには2つの可能性があります。

  • (簡単でシンプル)使用、Swing GUIへの出力は、スレッドセーフメソッドを含めて、Runnable#Threadにラップする必要があります。invokeLater()setTextappend

  • SwingWorkerを使用する

編集

Runnable#Threadの可視化を確認してください。これは、サーバーに接続し、長いファイルeiを解析するのと同じです。

invokeLater()を使用すると、呼び出しまでコンポーネントが存在するかどうかを確認できません

  1. GUIを作成し、

  2. GUIを表示、

  3. いくつかの(Swing / Util) Timerまたはuser actionからリダイレクトされた/からリダイレクトされたコードを呼び出すSwing EventDispatchThreadために、この理由のためにRunnable#ThreadまたはがありますSwingWorker

  4. 私は可能な2つの最も簡単な方法を提案します

于 2012-07-01T12:58:26.527 に答える
2

問題が発生しました...GUIは次のように作成されます。

EventQueue.invokeAndWait(new Runnable() {

            @Override
            public void run() {
                try {
                    Mainframe frame = new Mainframe();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

そして、オブジェクトメインフレームの構築時に、このコードが実行されます。

final JCheckBoxMenuItem chckbxmntmParsing = new JCheckBoxMenuItem("Parsing");
    chckbxmntmParsing.setName("mainframe.menu.data.parsing");
    localeChangedListener.add(chckbxmntmParsing);

    chckbxmntmParsing.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (chckbxmntmParsing.isSelected()) {
                parseManager.startParsing();
            } else {
                parseManager.stopParsing();
            }
        }
    });

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            boolean enabled = false;
            String prop = PropertyManager.get().getProperty("parser.continuousparsing.enabled");
            if (prop != null) {
                if (prop.trim().equals("true") || prop.trim().equals("1")) {
                    enabled = true;
                }
            }
            chckbxmntmParsing.setSelected(enabled);
        }
    });

したがって、ParseThreadはGUIのビルド後に開始されます。

時間を盗んでごめんなさい

于 2012-07-01T13:46:49.407 に答える