2012-07-04 158 views
0

我正在制作一个JFrame,它将从Internet上载入图片。我有这个工作,但这个JFrame的问题是有很多图片,所以他们需要很长时间才能加载。这很好,但我想向用户展示图片正在加载。出于某种原因,我无法让JPanel在加载JFrame中显示。我知道这是一个常见的错误,我已经尝试了很多修复程序,但都没有工作。这里是代码:JPanel不显示在JFrame中

final JFrame weatherLoadPop=new JFrame("Loading weather..."); 
weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
weatherLoadPop.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     weatherPop.dispose(); 
    }; 
}); 
weatherLoadPop.setResizable(false); 
weatherLoadPop.setBounds(100,50,225,100); 
JPanel weatherLoadPanel=new JPanel(); 
weatherLoadPanel.setBackground(Color.RED); 

weatherLoadPanel.setPreferredSize(new Dimension(225,100)); 
JLabel weatherLoadLabel=new JLabel("Loading...0%"); 
weatherLoadPanel.add(weatherLoadLabel); 
weatherLoadPop.add(weatherLoadPanel); 
weatherLoadPop.pack(); 
weatherLoadPop.validate(); 
weatherLoadPop.setVisible(true); 

我不确定我正在使用pack()和validate()。我不经常使用它们。无论如何,删除它们都无济于事。对我来说,这个问题最奇怪的部分是加载图片的JFrame工作得很漂亮,而JFrame加载更简单。

感谢您的任何帮助。

回答

1

它在这里工作得很好。也许你应该提供我们可以测试的sscce

我不得不改变你的事件监听器处置weatherLoadPop代替weatherPop并添加你的代码测试类:

package test; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String[] args) { 
     final JFrame weatherLoadPop = new JFrame("Loading weather..."); 
     weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     weatherLoadPop.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       weatherLoadPop.dispose(); 
      } 
     ; 
     }); 
     weatherLoadPop.setResizable(false); 
     weatherLoadPop.setBounds(100, 50, 225, 100); 
     JPanel weatherLoadPanel = new JPanel(); 
     weatherLoadPanel.setBackground(Color.RED); 

     weatherLoadPanel.setPreferredSize(new Dimension(225, 100)); 
     JLabel weatherLoadLabel = new JLabel("Loading...0%"); 
     weatherLoadPanel.add(weatherLoadLabel); 
     weatherLoadPop.add(weatherLoadPanel); 
     weatherLoadPop.pack(); 
     weatherLoadPop.validate(); 
     weatherLoadPop.setVisible(true); 
    } 
} 

和我得到:使用

Loading....

java version "1.7.0_04" 
Java(TM) SE Runtime Environment (build 1.7.0_04-b20) 
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) 
+0

Thanks Qsp。不太清楚ssce是什么。我点击链接并阅读该页面,但不是您提供ssce的代码?我会释放更多的代码,但我的程序是封闭的源代码。 在注释掉其余的函数之后,它就起作用了。实际上它总是在工作,但是JPanel直到包含它的函数完成才显示。我从来没有见过JPanel显示,因为我在函数结束之前调用了dispose()。 为什么它在显示JPanel之前等待函数完成,我该如何解决这个问题? 非常感谢您的帮助, Cameron –

+0

SSCCE正是我发布的内容,您应该自己做,让人们更快地帮助您(他们不需要准备课程并且可以复制-past和测试/修复你的代码)。 –

+0

看看这个[很好的答案](http://stackoverflow.com/a/9976255/856202)上的类似问题。如果我正确理解你的话,那么当你的函数执行操作正在执行时,你的摆动线程会冻结。所以你应该在一个新的线程中启动你的函数,从而防止JPanel显示上的锁定。如果你需要进一步的帮助,请说。 –