我有一个应该更新GUI的Gui类,它在Swing主线程中运行,必须从该线程访问。我有一些方法来改变Gui中显示的内容。其中一些方法可以从其他线程调用。我最终得到了这段代码:
public void changeSomethingInGui() {
change button enabled state for example...
}
public void changeSomethingInGuiAsync() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Gui.this.changeSomethingInGui();
}
});
}
这真的很糟糕,还有5个类似的方法,这个策略需要很多行完全没用(对于读者来说)代码。
没有比java更糟糕的处理回调的方式,这是肯定的,但是有没有一些解决方法?例如在C ++中,我可以将方法作为回调发布到这样的线程(使用boost库):
guiThreadClass.queueAction(boost::bind(Gui::DoSomethingInGui, guiInstance, param1, param2));
一条线。这将使我的班级中的每种方法都有3行 - 更加舒适。
答案 0 :(得分:2)
在Java 8中,给定此方法
public void changeSomethingInGui() {
//change button enabled state for example...
}
您可以替换此调用
public void changeSomethingInGuiAsync() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Gui.this.changeSomethingInGui();
}
});
}
public void changeSomethingInGuiAsync() {
EventQueue.invokeLater(() -> {
Gui.this.changeSomethingInGui();
});
}
public void changeSomethingInGuiAsync() {
EventQueue.invokeLater(Gui.this::changeSomethingInGui);
}
可能会找到其他最近的示例here。