在JFrame上显示延迟

时间:2013-02-12 09:44:08

标签: java swing jframe

我编写了一个程序,显示JFrame包含有关运行它的计算机(HOSTIP)的信息,并使JDBC连接显示另一个信息

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

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

NewFrame扩展了JFrame

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

当我运行该程序时,我看到JFrame边框 0.5-1 秒,然后才会收到信息,尽管我设置了它只有在构建之后才能看到。

这是我看到的关于 1 秒的内容:(内部是我的桌面背景)

before

然后我看到了这些信息:

after

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

2 个答案:

答案 0 :(得分:5)

听起来像是在阻止事件派发线程(EDT)

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

您可能想看看Concurrency in Swing,可能还有Swing Worker

处理Swing和Threads时的一个重要规则,你只能与EDT内部的Swing组件进行交互

答案 1 :(得分: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);