08/06/06 12:29:30
> そのたびにinvokeLater()を使うことになり、大変コーディング量が多くなると思います。
例えば、main()から実行を開始する場合、invokeLater()に渡す
Runnable#run()内で、Window(JFrame等)インスタンスやその他コンポーネントを構築して実行を開始します。
そうすれば、invokeLater()を意識せずともEDT上で実行されますので、通常は、その都度invokeLater()を呼び出す必要はありません。
> Swingでアプリを作っている人は、SwingのAPIを使用するとき、invokeLater()を
> 使ったり使わなかったりしていると思っています。
> そこで質問があるのですが、invokeLater()を使ってSwingのAPIを呼び出すのと
> invokeLater()を使わないことの切り分けの基準みたいなものがありましたら、
時間がかかる処理で、描画を伴わない場合、EDTと別スレッドで実行し、その処理が実行された後に、
GUIの描画を更新する必要がある場合、invokeLater()を使用します。
例えば、ListModelやTableModelをEDTと別スレッドで生成(Listenerが登録されておらずGUIと無関係であること)後、
そのModelをJList#setModel(),JTable#setModel()で設定する場合、setModel()内で再描画が要求されるため、
setModel()の呼び出しはEDT上で実行する必要があります。
もちろん、EDTと別スレッドで実行した処理がGUIと無関係であれば、上記の処理は不要です。
まぁ、ともあれ、Sunのページを読んで動作原理を理解した後、SwingUtilities#invokeLater(),SwingUtilities#invokeAndWait(),
SwingWorkerクラスも調べて、実行していれば自ずと理解できるのではないでしょうか。
切り分けの基準は、169と一緒。