2010-03-27 168 views
2

当我运行这个时,JLabel是不可见的,但是当我调整窗口大小(用鼠标)JLabel显示。为什么?Java JFrame很奇怪

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); 

    } 

} 
+1

对我来说,你的例子工作正常。 Windows 7 64位上的Java 1.6.0_17 – Midhat 2010-03-27 11:35:27

+2

仅仅为了添加组件而继承JFrame是一种糟糕的做法。 – kdgregory 2010-03-27 11:56:01

+0

它也适用于我,这就是为什么我怀疑是线程问题。 – 2010-03-27 11:59:33

回答

0

这看起来像一些在以前的Java虚拟机将L &˚F虫子在较新的操作系统。例如在Windows 7上,大多数问题首先由1.6.0_17解决。你应该用一个控制台启动你的程序。如果你在事件线程中看到一些堆栈跟踪,那么这是一个L错误的问题。

+0

对所有问题,问题解决。我更改Windows主题和所有工作正常。我认为这是Windows Aero和我的NVIDIA GeForce FX5500问题。此卡官方不与Windows Aero合作。 – rodion 2010-03-27 15:58:20

3

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

+0

实际上,'setSize()'应该具有调用'pack ()'并迫使框架自行摆脱,不是吗? – 2010-03-27 11:46:11

+1

'setSize()'只是告诉帧应该是多大;你需要调用'invalidate()'来告诉它重新计算它的组件。然而,调用'pack()'作为框架构建的最后一步是一个更好的习惯。 – kdgregory 2010-03-27 11:55:32

+0

我回顾一下--setSize()不直接调用'pack()'。但是,OP的代码在第一次尝试时为我工作,而无需调用'pack()'。在setSize()之后向'pack()'添加一个调用实际上具有覆盖给定大小设置的*不受欢迎*效果,使窗口小于OP希望的200x200。 – 2010-03-27 11:58:36

1

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

如果您更改main()以在Swing线程上调用您的GUI代码,怎么办?

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

with invokeLater我有同样的效果:( – rodion 2010-03-27 12:12:30

+0

)如果在将所有内容放入Swing线程后仍然存在相同的问题,那么我会尝试将组件放在JPanel中,并将JPanel设置为顶级容器的内容窗格,而不是添加它们直接到顶级容器,就像上面评论中提到的@kdgregory一样。 – 2010-03-27 12:16:32

+0

Thanx,但它是第一个,我正在尝试:) – rodion 2010-03-27 12:29:31

0

向所有人问好,问题已解决。我更改Windows主题和所有工作正常。我认为这是Windows Aero和我的NVIDIA GeForce FX5500问题。此卡官方不与Windows Aero合作。