在Swing中显示一个弹出窗口,指示程序启动的进度

时间:2014-04-09 18:18:39

标签: java swing jframe jpanel jdialog

我有一个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
}

现在的问题是,它不是向我显示它显示的消息:

blank

当程序加载的那一刻,它会显示最后一条消息(你可以通过评论toaster.setVisible(false)来看到这样的消息):

message

所以我知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

您正在阻止Event Dispatch Thread (EDT),因此GUI无法重新绘制自己,直到数据库访问完成执行。基本上,您需要使用单独的线程来访问数据库。

阅读Concurrency上Swing教程中的部分,了解更多信息以及使用Swing Worker的解决方案。