我有一个 JFrame
类,它的构造函数将花费一点时间(在某些情况下)来创建所有适当的对象。
我想做的是在主 panel
显示之前,我将有一个名为 toaster
的弹出窗口,它会说明我在程序执行的哪个阶段.这是我的构造函数:
public class GUI extends javax.swing.JFrame {
public GUI() {
JOptionPane toasterPane = new JOptionPane(null,
JOptionPane.INFORMATION_MESSAGE,
JOptionPane.DEFAULT_OPTION,
null,
new Object[]{},
null);
JDialog toaster = new JDialog();
toaster.setTitle("Loading...");
toaster.setModal(false);
toaster.setContentPane(toasterPane);
toaster.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
toaster.pack();
toaster.setVisible(true);
toasterPane.setMessage("Initializing Components...");
initComponents();
toasterPane.setMessage("Redirecting Console...");
_mc = new MessageConsole(jMessageConsoleTextPane, true);
_mc.redirectOut(null, null);
_mc.redirectErr(Color.RED, null);
_mc.setMessageLines(100);
toasterPane.setMessage("Connecting To Database...");
_user = new User("root", "");
_connector = new Connector(_user, "localhost", 3306);
_database = new SQLDatabase("testing", _connector);
updateComboBoxes();
toaster.setVisible(false);
}
//rest of the code here
}
现在的问题是,它没有向我显示消息,而是显示如下:
程序加载后,它将显示最后一条消息(您可以通过注释掉 toaster.setVisible(false)
来看到),如下所示:
那么知道我在这里做错了什么吗?
最佳答案
您正在阻止 事件调度线程 (EDT)
,因此在数据库访问完成执行之前,GUI 无法重新绘制自身。基本上你需要使用一个单独的线程来访问数据库。
阅读 Concurrency 上的 Swing 教程部分获取更多信息和使用 Swing Worker
的解决方案。
关于java - 在 Swing 中显示一个弹出窗口,指示程序启动的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970796/