1

我写了一个程序,它显示了一个JFrame包含有关运行它的机器的信息(HOSTIP),它JDBC建立连接以显示另一个信息。

我的main函数中只有这两行:

NewFrame nf = new NewFrame(); //Here I make all the needed calculations
nf.setVisible(true);

NewFrame 扩展了 JFrame

在构造函数中,我执行所有需要的计算并将它们设置为显示在nf JFrame.

当我运行程序时,我会看到0.5-1秒的边框,然后才会填充信息,尽管我将它设置为仅在构建后才可见。JFrame

这是我大约1秒钟看到的:(里面是我的桌面背景)

前

然后我看到了信息:

后

尽管我在构造函数中进行了所有计算,但为什么会发生这种情况?

4

2 回答 2

5

听起来您正在阻止事件调度线程(EDT)

您应该避免在 EDT 上运行任何可能阻塞或耗时的操作。这将阻止 EDT 调度重绘事件,这很重要。

您可能想看看Swing 中的ConcurrencySwing Worker

处理 Swing 和 Threads 时的重要规则之一,您只能从 EDT 内部与 Swing 组件交互

于 2013-02-12T09:53:48.070 回答
1

看起来您在 GUI 线程中同步进行了一些阻塞调用,即数据库查询。您应该使用以下方式异步执行此类操作SwingWorker

final JTextField field = new JTextField ();
field.setEditable (false);

JButton button = new JButton(new AbstractAction ("Calculate!") {
    @Override
    public void actionPerformed(ActionEvent e) {
        field.setText ("Calculating...");

        new SwingWorker<String, String> ()
        {
            @Override
            protected String doInBackground() throws Exception {
                Thread.sleep(3000L);

                field.setText ("Calculated!");

                return null;
            }
        }.execute();
    }
});

JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane ().setLayout (new BorderLayout());
frame.getContentPane ().add (button, BorderLayout.NORTH);
frame.getContentPane ().add (field, BorderLayout.CENTER);
frame.pack ();
frame.setVisible (true);
于 2013-02-12T09:53:54.560 回答