1

以下のコードが機能しません。理由を教えてください。私のコードも修正してください。私はJavaが初めてです。それに加えて、「ローディングパネルコンポーネント」を探していProgressMonitorます。誰かが以前にそのようなものを使用したことがある場合は、私に提案してください。

public class Main extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);

                    ProgressMonitor pm = new ProgressMonitor(frame, "Loading...", 
                            "waiting...",
                            0, 100000);

                    for (int i = 0 ; i < 100000 ; i ++){

                        pm.setProgress(i);
                        pm.setNote("Testing");
                        System.out.println(i);

                        Thread.sleep(1000);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}
4

3 に答える 3

8

@Mark Rotteveel が既に示したように、EDT (Event Dispatch Thread) を占有したままにしています。「進行状況バー/モニターを表示する方法」のチュートリアルには、貴重な情報とコード サンプルが含まれています。

しかし、基本的には、計算をワーカー スレッドに移動し (たとえば、 a を使用)、 EDT にSwingWorkerを表示することになります。どのような進行状況が既に行われProgressMonitorたかを示すのは、ワーカー スレッド次第です。ProgressMonitor

そして、ここSwingWorkerにそのチュートリアルのサンプルコードへの直接リンクがあります。これは、拡張機能 (Taskその例のクラス) で作業がどのように行われるか、および が に を追加することProgressMonitorによってどのように更新されるかを明確に示しています。。_PropertyChangeListenerSwingWorkerProgressMonitor

また、Swingと組み合わせて s を処理する方法、および EDT で重い計算を実行できない/実行しない理由についての詳細が記載されているSwing の同時実行チュートリアルを読むことをお勧めします。Thread

于 2012-07-21T09:00:33.843 に答える
5

Swing では、イベント スレッドが GUI を変更および更新します。その for ループとスリープでイベント スレッドをビジー状態に維持しているため、GUI を更新できません。イベントスレッドで行うすべてのことは、短命でなければなりません。他のすべては、イベント スレッドから移動する必要があります。

したがって、その for ループをイベント スレッドの外に移動する必要があります。

于 2012-07-21T08:11:01.693 に答える
4

1.経験則として、UI は UI スレッドで動作し、非 UI は非 UI スレッドで動作すると考えてください。

2. イベント ディスパッチャー スレッド (EDT) はここでは UI スレッドであるため、UI 以外のプロセスを集中的に処理する作業は、EDT の別のスレッドで行う必要があります。

3. 2 つの方法でこれを行うことができます.....

私。これを行うには、別のスレッドを作成します。

ii. SwingWorkerを使用して、非 UI スレッドと UI スレッドを同期します。

4. JFrame を EDT で可視化するためだけに main() メソッドを常に保持します。

例えば:

public static void main(String[] args){

       EventQueue.invokeLater(new Runnable(){

         public void run(){

             myframe.setVisible(true);

            }
         }
      }

SwingWorker の実際の例については、このサイトをご覧ください。

http://www.kodejava.org/examples/381.html

于 2012-07-21T09:01:52.423 に答える