JavaJFrame非常奇怪

JavaJFrame非常奇怪,java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,运行此操作时,JLabel不可见,但当我调整窗口大小(使用鼠标)时,会显示JLabel。为什么? import javax.swing.*; import java.awt.*; public class FrmTaoLogin extends JFrame { private JPanel pnlLeft = new JPanel(); public FrmTaoLogin() { super(); pnlLeft.setBorder(BorderFactor

运行此操作时,JLabel不可见,但当我调整窗口大小(使用鼠标)时,会显示JLabel。为什么?

import javax.swing.*;
import java.awt.*;

public class FrmTaoLogin extends JFrame {

  private JPanel pnlLeft = new JPanel();

  public FrmTaoLogin() {

    super();

    pnlLeft.setBorder(BorderFactory.createEtchedBorder());
    pnlLeft.add(new JLabel("test1"));
    getContentPane().add(pnlLeft,BorderLayout.SOUTH);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(200, 200); 

  }

  public static void main(String[] args) {

    FrmTaoLogin FrmLogin = new FrmTaoLogin();
    FrmLogin.setVisible(true);

  }

}

IIRC,如果不调用Frame.pack(),就会发生这种情况。如果将“pack()”作为构造函数的最后一行调用,它应该可以工作。

我怀疑这里的问题可能与尝试在外部构建和显示GUI组件有关

如果将
main()
更改为在Swing线程上调用GUI代码,会怎么样

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            FrmTaoLogin FrmLogin = new FrmTaoLogin();
            FrmLogin.setVisible(true);
        }
    });
}

这看起来像是新操作系统上旧Java虚拟机中的一些L&F错误。例如,在Windows 7上,大多数问题首先用1.6.017解决。你应该用控制台启动你的程序。如果您在事件线程中看到一些堆栈跟踪,则这是一个L&F错误问题。

Thanx总之,问题已解决。我改变了Windows主题,一切正常。我想这就是Windows Aero和我的NVIDIA GeForce FX5500的问题。此卡不适用于windows Aero。

对于我来说,您的示例很好。Windows 7 64Biti上的Java 1.6.017将JFrame子类化只是为了添加组件是一种不好的做法。它对我来说也很好,这就是我怀疑线程问题的原因。在@kdgregory的评论中,更好的做法是将组件放入
JPanel
中,然后将该
JPanel
设置为顶级容器的内容窗格(
JFrame
)。查看Swing toplevel containers教程了解更多示例:实际上,
setSize()
应该具有调用
pack()
并强制框架进行布局的效果,不是吗?
setSize()
只是告诉框架应该是什么大小;您需要调用
invalidate()
,告诉它重新计算其组件。但是,调用
pack()。但是,OP的代码在第一次尝试时对我有效,没有添加对
pack()
的调用。在
setSize()
之后添加对
pack()
的调用实际上产生了覆盖给定大小设置的不良效果,使窗口小于OP希望的200x200。使用pack()一切正常,但窗口大小不是200x200(对于invalidate,我具有相同的效力。)(对于invokeLater,我具有相同的效力:(如果在将所有内容放入Swing线程后仍然存在相同的问题,那么我会尝试将组件放入JPanel中,并将该JPanel设置为顶级容器的内容窗格,而不是直接将它们添加到顶级容器中,正如@kdgregory在上面的评论中所建议的那样。Thanx,但这是我首先尝试的:)谢谢大家,问题解决了。我更改了Windows主题,一切正常。我想这是Windows Aero和我的NVIDIA GeForce FX5500问题。这张卡不适用于Windows Aero。