【问题标题】:Components of JFrame are only in correct position after resize (sometimes)JFrame 的组件仅在调整大小后才处于正确位置(有时)
【发布时间】:2016-07-21 13:21:28
【问题描述】:

这个JFrame 包含一个JPanel,其中包含一个processing 草图。代码如下所示:

import javax.swing.JFrame;
import javax.swing.JPanel;
import processing.core.PApplet;

public class TestCase {
    public static void main(String[] args) {
        ProcessingFrame pFrame = new ProcessingFrame();
        pFrame.setVisible(true);
    }
}

@SuppressWarnings("serial")
public class ProcessingFrame extends JFrame{    
    public ProcessingFrame(){
        this.setSize(600, 400);
        this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        ProcessingSketch pSketch = new ProcessingSketch();
        panel.add(pSketch);
        this.add(panel);
        pSketch.init();
        this.setVisible(true);
    }
}

public class ProcessingSketch extends PApplet{
    public ProcessingSketch(){
        //...
    }   
    public void setup(){
        size(600, 400);
        background(200);
    }   
    public void draw(){
        rect(250,100,100,200);
    }
}

panel 和/或sketch 经常(大约 50%)未呈现到适当的位置。有时它们只是右侧框架大小的一半左右,有时我只看到框架中草图的底部。

用鼠标调整框架大小后,一切看起来都很好。我想将 JFrame 设置为 undecorated,但无法调整窗口大小以将所有内容都放置到位。

这是我试图解决的问题:

还有其他想法吗?

【问题讨论】:

  • The code looks something like this: - 对我们没有帮助。发布一个正确的SSCCE 来说明问题。
  • 谢谢@camickr,我试着创建一个测试用例。
  • 对不起,我不知道第 3 方包是做什么的。也许它正在影响布局。 SSCCE 应该基于 JDK 类。
  • @camickr 这是处理,它比 Java 库稍微复杂一点。它是一种自己的语言。您可以将它与 Java 混合使用,因此很多处理问题也可以使用 Java 标记。但我认为这与我们将能够获得的minimal reproducible example 一样接近。

标签: java swing jframe jpanel processing


【解决方案1】:

这听起来像是线程问题。处理使用它自己的动画线程,所以我对你遇到问题并不感到惊讶,我对它们是零星的并不感到惊讶。这就是线程的本质。

事实上,最新版本的 Processing 删除了像这样将 Processing 草图添加到 Swing 应用程序的功能。如果你真的想解决这个问题,你应该更新到最新版本的 Processing 并将其用作 Java 库。这需要更多的工作,但它比继续使用这种旧方法更“正确”。

但既然我知道这不是你想听到的,我会尝试的第一件事是调用JFrame.revalidate() 函数。您必须在初始化处理草图后执行此操作,这对于上述线程问题可能会很棘手。您可能需要以某种方式延迟它,或者通过setup() 函数来实现。

如果这不起作用,您可以在延迟一段时间后尝试以编程方式调整 JFrame 的大小。这很骇人听闻,但“正确”的继续进行的方法是更新您的处理并停止以旧方式嵌入它。

【讨论】:

  • 非常感谢! JFrame.revaildate() 工作得很好。我把它作为最后一个命令放入setup()。事实上,对处理 3 的更改是我的愿望清单上最大的点之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多