我正在创建一个从SQL数据库中提取数据的项目。当数据加载时,我希望最终用户看到加载框架。在第一次运行时,它显示带有图像的框架。第二次,当用户更改他看到的区域时,框架再次出现,但这一次在动作内部的功能完成之后才显示图像。你能看看我的代码并指出我做错了吗?
confirm.addActionListener(new ActionListener()
{
ArrayList<String> newZones = new ArrayList<String>();
public void actionPerformed(ActionEvent e)
{
JFrame loadingFrame = new JFrame();
JPanel loadingPanel = new JPanel();
loadingFrame.setSize(500, 500);
JLabel loadingL = new JLabel(new ImageIcon("C:/Users/gria/Desktop/Images/Loading.png"));
loadingPanel.add(loadingL);
loadingFrame.add(loadingPanel);
loadingFrame.validate();
loadingFrame.repaint();
loadingFrame.pack();
loadingFrame.setVisible(true);
// The Image will not show until this function finishes which is where all the data base connections take place.
Console.SetZones(newZones);
}
});
答案 0 :(得分:2)
在此功能完成之前,图像不会显示,这是所有数据库连接发生的地方。
Swing是单线程的,这意味着调用任何可能花费大量时间的任务将阻止Swing执行其正常任务(绘画,事件调度等等),直到该任务完成。您的代码调用以下内容:
// The Image will not show until this function finishes which is where all the data base connections take place.
Console.SetZones(newZones);
...来自ActionListener
实现,这意味着它是在事件调度线程(EDT)上调用的。要避免这种情况,请在新Thread中调用此方法或使用SwingWorker。无论哪种方式,请确保使用SwingUtilities.invoke*
或使用SwingWorker将其方法
答案 1 :(得分:0)
Lukas Rotter在评论中发表了正确答案。问题似乎与
有关 (LFrameCreated == false)