JFrame 的组件仅在调整大小后处于正确位置(有时)

Components of JFrame are only in correct position after resize (sometimes)

有这个 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);
    }
}

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

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

这就是我试图解决的问题:

还有其他想法吗?

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

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

但是因为我知道这不是您想听到的,所以我尝试的第一件事就是调用 JFrame.revalidate() 函数。您必须在 Processing sketch 初始化后执行此操作,这对于上述线程问题可能会很棘手。您可能必须将其置于某种延迟中,或者从 setup() 函数中执行。

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