我正在为我的学生编写MathQuiz,包括用于渲染的JLatexMath和用于蜂鸣器的jinput。问题是,有时(像每四次一样)当我启动程序时,所有组件都不可见。它们在调整JFrame大小后出现。首先,我想到了jinput或jlatexMath库中的Bug,但是即使使用最小的代码,我也会遇到相同的错误:
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(); } }
代码有什么问题?
首先移到setVisible(true);构造函数的末尾。
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); }
为了防止出现任何其他可能的图形故障,您应该始终从事件调度线程中启动UI,有关更多详细信息,请参阅初始线程。