我正在为我的学生编写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);移到构造函数的末尾。

而不是去这里...

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,有关更多详细信息,请参见Initial Threads

07-26 08:32