Swing はスレッドセーフではありません
1. UI スレッドはイベント ディスパッチャ スレッドであり、Gui の作業を担当します。
2. UI スレッドの外部で非 Ui スレッドを操作してみます。
3. もちろん、UI スレッド内からスレッドを起動することもできますが、UI スレッドから除外することをお勧めします。そうしないと、GUI が応答しないように見える場合があります。
(つまり、UI 作業を担当する UI スレッドの非 UI スレッド OUT での非 UI 作業)
4.スイングの方法もあります... SwingWorkerを使用します。これは、 UI スレッドと非 UI スレッド間の同期を処理します。
編集部分:
// フレーム/JFRAME にコンポーネントを直接追加するのは良くないことに注意してください。
public class MyClass extends JFrame{
private final JButton b;
public MyClass(){
this.setSize(300,300);
this.setComponent();
this.setHandler();
}
public void setComponent(){
b = new JButton("Click");
this.add(b);
}
public void setHandler(){
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// Do whatever you want...
}
});
}
public static void main (String[] args) {
EventQueue.invokeLater(new Runnable(){ // UI THREAD
public void run(){
MyClass s = new MyClass();
s.setVisible(true);
}
});
}
}
メイン メソッドは Swing では短命です。メイン メソッド() は、GUI の構築をイベント ディスパッチャー スレッド (EDT) にスケジュールしてから終了します。そのため、GUI を処理するのは EDT の責任です。そのため、非 UI スレッドでの非 UI 作業を EDT から遠ざけることを常にお勧めします。