启动JavaSwing桌面应用程序的正确方法
启动需要5-10秒从数据库检索初始数据的应用程序的正确方法是什么?这就是我到目前为止所得到的,但我不确定是否有更好的方法。我希望GUI和数据库访问将在不同的线程中进行,以便GUI构建与数据检索同时进行启动JavaSwing桌面应用程序的正确方法,java,multithreading,model-view-controller,swing,user-interface,Java,Multithreading,Model View Controller,Swing,User Interface,启动需要5-10秒从数据库检索初始数据的应用程序的正确方法是什么?这就是我到目前为止所得到的,但我不确定是否有更好的方法。我希望GUI和数据库访问将在不同的线程中进行,以便GUI构建与数据检索同时进行 public static void main(String[] args) { final Controller controller = new Controller(); SwingUtilities.invokeLater(new Runnable() {
public static void main(String[] args) {
final Controller controller = new Controller();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
View frame = new View();
controller.setView(frame);
}
});
Model model = new Model();
controller.setModel(model);
controller.getInitialData();
}
你说得对。希望这能让事情变得更清楚一点 Swing不是线程安全的。也就是说,你可以做几件事。一个选项是用于在要执行的事件调度线程上发布
Runnable
任务。这将使您能够从数据库中检索数据,并在一个单独的线程中更新UI,同时考虑Swing的单线程模型
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
// update UI
}
});
由于这是一项长期运行的任务,因此另一个选项是在完成时或在处理时使用提供UI更新
如您所见,这两种机制(即
SwingUtilities
和SwingWorker
)使您能够将此类任务专用于其他线程,同时使您能够将结果(通常转换为操作)放在EventQueue
上,以便以后(安全)执行。无论您选择哪一种,重要的是要记住,长时间运行的任务决不能在EDT
中进行。因此,正如我逐渐发现的那样,任何设计良好的GUI最重要的功能都是响应能力。我不确定自己是否理解问题所在。您需要设计GUI,以便在数据库访问完成时它能够对模型中的更改作出反应。与JTable
侦听来自TableModel
的事件的方式相同,您的整个UI应该侦听来自模型的事件(如“DB access done”)。您可以在加载数据时,在GUI出现之前,显示一个。否则,您也可以启动GUI,冻结它,并在加载数据时显示一些消息。我可以想象,您的getInitialData方法主体将创建一个SwingWorker,并从SwingWorker内部获取数据本身,然后如上面的注释所述,在该操作完成时通知GUI。所有这些都是非常好的建议。