Javaに関する本を何冊か読んだことがあります。それらのすべてに、GUIプログラミングを教える少なくとも1つの章がありました。それらすべてにおいて、単純なフォームアプリケーションの作成は次のロジックに従っていました。
MyFrame.java
public class MyFrame extends JFrame
{
JButton button1;
public MyFrame()
{
button1 = new JButton("Click here.");
}
}
FrameTest.java:
public class FrameTest
{
public static void main(String[] args)
{
MyFrame myFrame = new MyFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(600, 600);
myFrame.setVisible(true);
}
}
基本的には、JFrameをサブクラス化してフォームを作成し、インスタンス変数として他のコンポーネントを宣言し、コンストラクターでそれらのコンポーネントを初期化します。次に、別のテストクラスを作成し、そのクラスのフレームサブクラスをインスタンス化し、そのメソッドのいくつかを呼び出して表示します。
しかし、並行性のレッスンでは、作成するすべてのアプリケーションでmain()を実行するメインスレッドがあることを学びました。私の知る限り、GUIアプリケーションを作成するためにSwingを使用する場合、別のスレッド(Event Dispatcher Thread)があります。したがって、私が間違っていなければ、すべてのSwingベースのGUIアプリケーションには少なくとも2つのスレッドがあります。これにより、すべてのGUIアプリケーションがマルチスレッド化されます。また、私が読んだいくつかの記事やチュートリアルでは、Swingはマルチスレッドをサポートしていないため、すべてのGUIコンポーネントは、イベントディスパッチャースレッドでのみ作成および変更する必要があります。そうしないと、スレッドの干渉やメモリの不整合エラーが発生する可能性があります。
ウィキペディアの最も単純な例(http://en.wikipedia.org/wiki/Swing_%28Java%29)でも、invokeLaterメソッドを使用してこのように作成されています。
では、どちらが真のアプローチですか?私はどこが間違っていますか?