プログラムのコア部分とプログラムの GUI 部分を分離する方法がわかりません。実際、Web 上のすべての例では、GUI アクションは SwingUtilities.invokeLater() メソッドで実行する必要があると書かれています。
問題は、このメソッドを使用して GUI 部分のみを処理する方法と、コアと GUI が通信する方法を理解できないことです。
たとえば、いくつかの計算の GUI 表示を担当するクラスがあります。
public class GUI {
private JFrame window;
public GUI() {
window = null;
}
public void createWindow(int width, int height) {
window = new JFrame();
...
window.setVisible(true);
}
public void displayResults(Calcul results) {
/* Some Swing actions. */
}
}
そして私は私のプログラムのコアを持っています:
public class Core {
public static void main(String[] args) {
GUI gui = new GUI();
Calcul calculs = new Calcul();
while (true) {
/* Make some calculations. */
/* Put results into calcul. */
displayResults(calculs);
}
}
}
このアーキテクチャが理想的ではないことはわかっていますが、使用する必要があります。私の質問は、EDT を使用して GUI 部分とコア部分を分離する必要があるかどうかです。そして、答えが「はい」の場合、どうすればよいですか?
可能であれば、GUI クラスを使用するユーザーに対して EDT 呼び出しが透過的である必要があります。
編集:
次の GUI クラスの変換は期待どおりの動作をしますか?
public class GUI {
private JFrame window;
public GUI() {
window = null;
}
public void createWindowEDT(final int width, final int height) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
createWindow(width, height);
}
}
);
}
private void createWindow(final int width, final int height) {
window = new JFrame();
...
window.setVisible(true);
}
public void displayResultsEDT(final Calcul results) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
displayResultsEDT(results);
}
}
);
}
private void displayResults(final Calcul results) {
/* Some Swing actions. */
}
}