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

Java Swing元素在每次运行时都会更改,java,swing,jlabel,positioning,absolutelayout,Java,Swing,Jlabel,Positioning,Absolutelayout,所以我用java的swing库编写了一个程序。我制作了一个绘制方程图的程序,如果相关的话,这里是主要的方法: public static void main(String[] args) throws Exception { JFrame frame= new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setLayo

所以我用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类型。 我知道如果我使用空的绝对LayoutManager,它将始终有效。但我只是想知道为什么swing中有这么多不一致的地方。我以前注意到过类似的东西,但我认为这只是程序中的一些错误。为什么会这样? 提前谢谢

  • 首先移动
    frame.setVisible(true)
    main
    方法的末尾
  • gp.setBounds(100100700700)是无意义的,因为
    gp
    受布局管理器的控制(
    GridLayout
  • 同时使用
    path
    setSize
    没有任何意义,
    pack
    通常是一个更安全的选项,但这取决于组件是否正确覆盖
    getPreferredSize
但我只是想知道为什么swing中有这么多不一致的地方。我以前注意到过类似的东西,但我认为这只是程序中的一些错误。为什么会这样

主要是因为您没有正确使用API。由于
JFrame
物理连接到本机对等机的方式,当您到达
gp.setBounds
时,该帧可能在屏幕上可见,也可能不可见

此外,由于您在“主”线程而不是事件调度线程中完成所有工作,因此您在它们之间运行竞争条件的风险,有关更多详细信息,请参阅

Swing非常灵活,当你做错事(或以错误的方式做事)时,它也是不可原谅的。

  • 首先移动
    frame.setVisible(true)
    main
    方法的末尾
  • gp.setBounds(100100700700)是无意义的,因为
    gp
    受布局管理器的控制(
    GridLayout
  • 同时使用
    path
    setSize
    没有任何意义,
    pack
    通常是一个更安全的选项,但这取决于组件是否正确覆盖
    getPreferredSize
但我只是想知道为什么swing中有这么多不一致的地方。我以前注意到过类似的东西,但我认为这只是程序中的一些错误。为什么会这样

主要是因为您没有正确使用API。由于
JFrame
物理连接到本机对等机的方式,当您到达
gp.setBounds
时,该帧可能在屏幕上可见,也可能不可见

此外,由于您在“主”线程而不是事件调度线程中完成所有工作,因此您在它们之间运行竞争条件的风险,有关更多详细信息,请参阅


Swing非常灵活,当你做错事(或以错误的方式做错事)时,它也是不可原谅的。

但是为什么它一次奏效,另一次却不行呢?它应该一直工作还是永远不工作?请参阅更新,您可能在“主”线程和事件调度线程(除其他外)之间存在竞争条件,这使得主方法可能在实际显示帧之前达到设置的界限……好的,谢谢!但为什么一次成功,另一次却没有?它应该一直工作还是永远不工作?请参阅更新,您可能在“主”线程和事件调度线程(除其他外)之间存在竞争条件,这使得主方法可能在实际显示帧之前达到设置的界限……好的,谢谢!