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

Posted

技术标签:

【中文标题】Java SWING:随机添加一个 JTextField(从未在任何地方使用过)使屏幕变白【英文标题】:Java SWING: adding a JTextField (never used anywhere) randomly makes the screen go white 【发布时间】:2011-08-08 21:05:50 【问题描述】:

我正在使用 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);       


【问题讨论】:

我不是 Java 框架方面的专家,但我以前从未见过从 JLabel 中显示整个 GUI。这正常吗? @thasc 不,不是 JLabel 的用途。 tsiki 可能只是为了说明问题而这样做。 你有一个非常奇怪的 GUI。 你能创建一个更小的例子吗?这里有很多垃圾。删除它可能会发现问题,或者至少可以删除丢失的废物。 是的,这是我能弄清楚如何将卡片放在背景图像之上的唯一方法。不过,如果有人有更好的建议,我愿意接受。 【参考方案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】:

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

【讨论】:

以上是关于Java SWING:随机添加一个 JTextField(从未在任何地方使用过)使屏幕变白的主要内容,如果未能解决你的问题,请参考以下文章

重置游戏循环/重启游戏java swing

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

java swing 中的列表框JList如何在程序中动态的添加和删除元素

JAVA——Swing实现窗口添加课程信息

为什么我的Java应用程序在启动后随机冻结?

Java swing 添加来自另一个类的组件