【问题标题】:Force immediate layout and paint in Swing在 Swing 中强制立即布局和绘制
【发布时间】:2011-01-21 16:44:33
【问题描述】:

我似乎无法在 Swing 中强制布局。我将JComponent 添加到JLayeredPane,并在JComponent 上设置了边框。然后,我想立即重新绘制所有内容 - 不是像 invalidate() 那样“请尽快完成”,而是同步且立即。有什么帮助吗?我似乎找不到正确的方法来做这件事,而我所有关于 invalidate(), validate(), repaint(), doLayout(), etc 的阅读都让我更加困惑!

【问题讨论】:

    标签: swing layout paint


    【解决方案1】:

    根据this(参见标题为“同步绘画”的部分),paintImmediately() 方法应该可以工作。

    【讨论】:

    • 我已经尝试过了 - myComponent.paintImmediately(myComponent.getBounds)。不走运:(我认为这可能是因为更改边框需要新的布局通道,因为边框在对象的每一侧都使用了一些额外的像素
    • paintImmediately 可能是要走的路,但我认为您仍然需要使用 invokeLater 或 invokeAndWait 将其作为事件发布。
    • @Hamy 你有没有试过在父组件上调用它,这可能会改变布局。
    【解决方案2】:

    让 Swing 更新显示的最可靠方法是使用 SwingUtilities.invokeLater。在你的情况下,它看起来像

    SwingUtilities.invokeLater(new Runnable {
                                 public void run() { 
                                    somecomponent.repaint();
                                 }
                               });
    

    我意识到“invokelater”听起来并不像它立即执行任何操作,但实际上,与仅调用例如直接somecomponent.repaint()。如果你绝对必须让你的控制代码等待GUI更新,那么还有invokeAndWait,但我的经验是这很少需要。

    另见:document on event dispatch 在 Swing 中。

    【讨论】:

    • 不幸的是,这些都不适用于我的 impl:/ 我需要立即进行 GUI 更新,而不是在处理未决事件之后。由于我的设计存在缺陷,我需要这种方式,但不幸的是,更改它会使我推迟近两周,明天我就有一个可交付成果:/
    • 好吧,试试这个:使用invokeAndWait,然后在外部容器的runnable调用paintImmediately。我认为这与使用 Swing 所能达到的一样接近——如果我没记错的话,它将覆盖以前对“重绘”的调用。
    • 不幸的是,这也不起作用。要调用 invokeAndWait,您必须生成一个新线程。我有一个 very 缓慢的事件在此绘画之后立即发生,并且它在可运行对象启动之前开始执行,导致 GUI 冻结而尚未执行此绘画调用
    • invokeAndWait 调用不会产生一个新线程——它只是将你的 Runnable 添加到事件队列中,然后阻塞你当前的线程直到事件被调用。如果您在使用 invokeAndWait 时仍然没有看到“变化”,那么您很可能重新绘制了错误的对象。一种检查方法是将调试输出添加到组件的 (g)paint 方法中。
    【解决方案3】:

    这太老了,但我找到了一个简单的解决方案,我将用 JPasswordField 展示它:

    var pw = new JPasswordField();
    ...
    pw.paint(pw.getGraphics()); // paints immediately
    

    【讨论】:

      猜你喜欢
      • 2016-09-21
      • 2011-11-16
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多