【问题标题】:Java Swing elements change every runtimeJava Swing 元素在每次运行时都会发生变化
【发布时间】:2016-05-24 08:42:56
【问题描述】:

所以我用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,它将始终有效。但我只是想知道为什么摇摆中有这样的不一致之处。我以前注意到过这样的事情,但我认为这只是程序中的一些错误。为什么是这样? 提前致谢!

【问题讨论】:

    标签: java swing jlabel positioning absolutelayout


    【解决方案1】:
    • 首先将 frame.setVisible(true); 移动到 main 方法的末尾
    • 这个gp.setBounds(100, 100, 700, 700); 毫无意义,因为gp 处于布局管理器的控制之下 (GridLayout)
    • 同时使用pathsetSize 毫无意义,pack 通常是更安全的选择,但这取决于您的组件是否正确覆盖getPreferredSize

    但我只是想知道为什么 Swing 会有如此不一致的地方。我以前注意到过这样的事情,但我认为这只是程序中的一些错误。这是为什么呢?

    主要是因为您没有正确使用 API。由于JFrame 物理连接到本地对等点的方式,当您到达gp.setBounds 时,框架可能会或可能不会在屏幕上实际可见。

    此外,由于您是在“主”线程而不是事件调度线程中完成所有工作,因此您面临着它们之间存在竞争条件的风险,请参阅Initial Threads 了解更多详细信息。

    Swing 非常灵活,当你做错事(或以错误的方式做事)时,它也是无情的

    【讨论】:

    • 但是为什么一次有效,而另一次无效?它不应该总是工作还是永远工作?
    • 查看更新,“主”线程和事件调度线程(除其他外)之间可能存在竞争条件
    • 这是有道理的,有一次 main 方法可能在实际显示框架之前就已经达到了设定的界限...好的,谢谢!
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2018-07-12
    • 2016-06-12
    • 2020-02-03
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多