Java布局不显示组件(有时)

问题描述:

我正在为我的学生写一个MathQuiz,包括JLatexMath用于蜂鸣器的渲染和输入。问题在于,有时(如每第四次)当我启动程序时,没有任何组件可见。它们在调整JFrame大小后出现。 首先,我想在jinput或jlatexMath库错误的,但我得到了同样的错误,即使这个最小代码:Java布局不显示组件(有时)

public class Shell extends JFrame{ 

    private JButton button1; 
    private JButton button2; 
    private Formula formula; 

    public Shell() { 
    super("blaBla"); 
    this.setSize(800, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); 
    Box b = Box.createHorizontalBox(); 
    button1 = new JButton(" "); 
    button1.setEnabled(false); 
    b.add(button1); 
    b.add(Box.createHorizontalGlue()); 
    button2 = new JButton(" "); 
    button2.setEnabled(false); 
    b.add(button2); 
    add(b); 
    JPanel formulaPanel = new JPanel(); 
    add(Box.createVerticalStrut(20)); 
    add(formulaPanel); 
    } 

    public static void main(String[] args) { 
    Shell s = new Shell(); 
    } 
} 

什么是错的,用的代码?

+0

那么,如果您对Swing有奇怪的问题,最好注意文档并确保所有的[Swing代码在Event Dispatch Threa上执行d。](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)从那里开始。 – markspace 2014-10-31 01:05:07

+0

好的,thx为快速回答。我添加了 System.out.println(javax.swing.SwingUtilities.isEventDispatchThread()); 给构造函数我在控制台上弄错了。我怎样才能让我的线程EventDispatchThread? – user3648884 2014-10-31 01:12:21

+0

我给你的链接左侧有几个链接。最好阅读所有的文档,否则谁知道你错过了什么。 [尝试此链接,](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html),但您确实需要阅读关于Java中并发性的整个部分。至少。 – markspace 2014-10-31 01:16:56

首先将setVisible(true);移动到构造函数的末尾。

而不是在这里...

public Shell() { 
    super("blaBla"); 
    this.setSize(800, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    //... 
} 

移动在这里......

public Shell() { 
    super("blaBla"); 
    //... 
    add(Box.createVerticalStrut(20)); 
    add(formulaPanel); 
    setVisible(true); 
} 

为了防止其他任何可能的故障的图形,你应该始终启动你的用户界面的从事件中调度线程,请参阅Initial Threads以获取更多详细信息

+0

setVisible在构造函数的最后似乎很好地工作到目前为止。 感谢您的帮助:-) – user3648884 2014-10-31 01:17:42