JPanel在第二次加载时没有显示图像

时间:2016-08-15 13:11:17

标签: java image swing jframe

我正在创建一个从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); 
        }
    });

2 个答案:

答案 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将其方法

分配给来自其他线程的Swing调用到EDT。

答案 1 :(得分:0)

Lukas Rotter在评论中发表了正确答案。问题似乎与

有关

(LFrameCreated == false)