我正在使用Eclipse在ubuntu 10.04上开发,当我在下面的代码中添加JTextField
(我没有在任何地方使用,或使其可见!)时,窗口,而不是像它应该显示的那样显示图像,变成空白。
有人知道是什么引起的吗?
import java.awt.FlowLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Testi {
public static void main(String[] args) {
ImageIcon icon1 = new ImageIcon("background.jpg");
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700,500);
JPanel panel = new JPanel();
panel.setSize(600, 600);
panel.setOpaque(false);
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel label = new JLabel();
label.setSize(500, 500);
label.setIcon(icon1);
label.setLayout(new FlowLayout(FlowLayout.CENTER));
// FOLLOWING LINE IS THE PROBLEM: when in code, the screen goes white
JTextArea text1 = new JTextArea("asd");
label.add(panel);
frame.add(label);
}
}
适合我,这让我认为这是一个EDT问题。将对setVisible
的调用移到主方法的末尾。
链接:http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
这个方法是线程安全的,尽管大多数Swing方法不是。应用程序的GUI通常可以在主线程中构造和显示:只要没有实现组件(Swing或其他),下面的典型代码是安全的:
public class MyApplication {
public static void main(String[] args) {
JFrame f = new JFrame("Labels");
// Add components to
// the frame here...
f.pack();
f.show();
// Don't do any more GUI work here...
}
}
上面显示的所有代码都运行在"main"线程上。f.pack()调用实现了JFrame下的组件。这意味着,从技术上讲,f.show()调用是不安全的,应该在事件调度线程中执行。然而,只要程序还没有一个可见的GUI, JFrame或它的内容就极不可能在f.show()返回之前收到paint()调用。因为f.s ushow()调用之后没有GUI代码,所以所有GUI工作都从主线程转移到事件调度线程,并且前面的代码实际上是线程安全的。
我也遇到了同样的问题。对我来说,解决办法是将调用移动到frame.setVisible()
下面的部分,我添加了我的组件。