我不明白如何将程序的核心部分与程序的 GUI 部分分开。事实上,网络上的所有示例都说任何 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 部分和核心部分吗?而且,如果答案是肯定的,我该怎么做?
如果可能,我需要 EDT 调用对使用 GUI 类的用户是透明的。
编辑:
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. */
}
}
最佳答案
您可以在您的 GUI
类中隐藏事件调度线程 (EDT) 的使用。鉴于 Swing 组件通常不是线程安全的,因此只有与 Swing 组件的交互才需要在 EDT 上进行。
GUI 类中不需要任何同步,因为只有主应用程序线程会调用 GUI.displayResults(Calcul)
,但如果这发生变化,您可能需要同步此方法或采取避免线程错误的其他步骤。
public class GUI
{
...
public void displayResults(Calcul results)
{
SwingUtils.invokeLater(
new Runnable()
{
public void run()
{
/* Some Swing actions. */
}
}
);
}
}
关于Java Swing 核心与 GUI 分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344560/