我编写了一个程序,显示JFrame
包含有关运行它的计算机(HOST
和IP
)的信息,并使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 秒的内容:(内部是我的桌面背景)
然后我看到了这些信息:
为什么会发生这种情况,尽管我在构造函数中进行了所有计算?
答案 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);