Java Swing 元素每次运行时都会更改

Java Swing elements change every runtime

所以我用java的swing库做了一个程序。我制作了一个绘制方程式的程序,如果相关的话,这里是主要方法:

public static void main(String[] args) throws Exception {

    JFrame frame= new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    frame.setLayout(new GridLayout(1,2));

    GraphPanel gp = new GraphPanel();
    GraphPanel gp2 = new GraphPanel();

    //gp.functs.add(new Function(Phrase.createPhrase("2(25-x^2)^(1/2)")));
    //gp.functs.add(new Function(Phrase.createPhrase("-1.1((25-x^2)^(1/2))")));
    gp.functs.add(new Function(Phrase.createPhrase("x^2")));
    //gp.functs.add(new Function(Phrase.createPhrase("-4/x^2+6")));
    gp2.functs.add(new Function(Phrase.createPhrase("sinx")));

    frame.add(gp);
    frame.add(gp2);
    frame.pack();
    frame.setSize(800, 800);


    //gp.setBorder(BorderFactory.createLineBorder(Color.RED));
    gp.setBounds(100, 100, 700, 700);//I WANT THIS TO ALWAYS RUN

}

我 运行 在不更改任何部分的情况下试运行程序两次,这就是它的样子:

然后下一次我运行它:

如果相关,GraphPanel 是 JLabel 类型。 我知道如果我使用 null 绝对 LayoutManager,它将始终有效。但我只是想知道为什么 swing 中有这样的不一致之处。我以前注意到过这样的事情,但我认为这只是程序中的一些错误。为什么是这样? 提前致谢!

  • 首先将 frame.setVisible(true); 移动到 main 方法的末尾
  • 这个 gp.setBounds(100, 100, 700, 700); 毫无意义,因为 gp 受布局管理器 (GridLayout)
  • 控制
  • 没有必要同时使用 pathsetSizepack 通常是更安全的选择,但这取决于您的组件是否正确覆盖 getPreferredSize

But I'm just wondering why swing has such inconsistencies in it. I've noticed stuff like this before but I though it was just some error in the program. Why is this?

主要是因为您没有正确使用 API。由于 JFrame 物理连接到本机对等体的方式,当您到达 gp.setBounds.

时,该框架可能会或可能不会在屏幕上显示。

此外,由于您是在 "main" 线程而不是事件调度线程中完成所有工作,因此 运行 它们之间存在竞争条件的风险,请参阅 Initial Threads了解更多详情。

Swing 非常灵活,当您做错事(或做错事)时,它也是无情的