有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSwing:随机添加一个JTextField(从未在任何地方使用)会使屏幕变白

我正在使用Eclipse在Ubuntu10.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);       
}
}

共 (2) 个答案

  1. # 1 楼答案

    对我有效,这让我觉得这是EDT的问题。将对setVisible的调用移动到main方法的末尾

    从这个链接: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... 
       } 
    }
    

    上面显示的所有代码都在“主”线程上运行。f.pack()调用实现JFrame下的组件。这意味着,从技术上讲,f.show()调用是不安全的,应该在事件调度线程中执行。然而,只要程序还没有一个可见的GUI,JFrame或其内容就不太可能在f.show()返回之前收到paint()调用。因为在f.show()调用之后没有GUI代码,所以所有GUI工作都从主线程转移到事件调度线程,而前面的代码实际上是线程安全的

  2. # 2 楼答案

    我也有同样的问题。 对我来说,解决方法是将调用移动到我添加组件的部分下方的frame.setVisible()