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

时间:2016-04-01 16:28:51

标签: java swing jframe jpanel processing

这个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和/或sketch未呈现到适当的位置。有时它们只是右边框架尺寸的一半左右,有时我只看到框架中草图的底部。

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

这是我试图解决的问题:

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

如果这不起作用,您可以尝试以编程方式在延迟一段时间后调整JFrame的大小。这是非常hackish,但再次,“正确”的方法是更新你的处理并停止以旧的方式嵌入它。