【问题标题】:Flicker of JFrames before moving locations移动位置前的 JFrame 闪烁
【发布时间】:2012-02-20 05:38:21
【问题描述】:

我注意到我的大部分挥杆 GUI 会在它们居中之前闪烁。这发生在我制作的几乎所有 JFrame 中,我想知道是否有解决方法。我通常打电话给setVisible(true),然后是pack(),然后是setLocationRelativeTo(null)。这使它出现在右上角,然后居中。我知道闪烁的发生是因为每个方法调用都需要时间,但是有没有解决方法(为了让它变得漂亮和流畅)?

【问题讨论】:

    标签: java swing jframe centering


    【解决方案1】:

    你应该先做setLocationRelativeTo(null),最后再做setVisible(true)

    【讨论】:

    • 问题在于 GUI 的右上角是居中的,而不是整个 JFrame。
    • pack() 应该被称为 before setLocationRelativeTo(null) 以使其居中。我想这就是 GP Singh 的意思。 (但在我的回答中,我对方法调用的顺序更加明确。)
    • 另请参阅我的答案的编辑,这有望解释发生了什么。
    【解决方案2】:

    这个顺序(和这些方法)更好:

    1. frame.pack();
    2. frame.setLocationByPlatform(true); // superior to centering
    3. frame.setVisible(true);

    如果你设置了一些可见的帧,它们可能会出现like this

    当然,没有任何闪烁,摆动晃动。 ;)


    问题在于 (setLocationRelativeTo(null)) 是 GUI 的右上角居中,而不是整个 JFrame。

    JFrame 的默认大小为 0x0,并且一直保持这种状态,直到调用 pack()setSize()(但您现在使用 pack())被调用。因此,如果您要求 0x0 组件在屏幕上居中,JRE 会将 0x0 大小的组件的“中间像素”放置在屏幕的正中心。

    或者,如果您先打包它,它具有正确的尺寸,并且该方法将按预期工作。例如

    frame.pack();
    frame.setLocationRelativeTo(null); // show my splash screen!
    frame.setVisible(true);
    

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多