我有一个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)
来看到这样的消息):
所以我知道我在这里做错了什么?
答案 0 :(得分:3)
您正在阻止Event Dispatch Thread (EDT)
,因此GUI无法重新绘制自己,直到数据库访问完成执行。基本上,您需要使用单独的线程来访问数据库。
阅读Concurrency上Swing教程中的部分,了解更多信息以及使用Swing Worker
的解决方案。