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 的大小以将所有内容都放置到位。
这就是我试图解决的问题:
JFrame.repaint()
此处建议:Java items appear only after the window is resize。 - 没有效果。
我想我可以手动调整 window 的大小,然后更改为 undecorated
。继这个问题的答案:Modifying a JFrame from within a Listener。但是处理草图崩溃了,因为我必须 dispose
JFrame。
还有其他想法吗?
这听起来像是线程问题。处理使用它自己的动画线程,所以我对你遇到问题并不感到惊讶,而且它们是零星的我并不感到惊讶。这就是线程的本质。
事实上,最新版本的 Processing 删除了像这样将 Processing sketch 添加到 Swing 应用程序的功能。如果你真的想解决这个问题,你应该更新到最新版本的 Processing 并将其用作 Java 库。这需要更多工作,但比继续采用这种旧方法 "correct" 更重要。
但是因为我知道这不是您想听到的,所以我尝试的第一件事就是调用 JFrame.revalidate()
函数。您必须在 Processing sketch 初始化后执行此操作,这对于上述线程问题可能会很棘手。您可能必须将其置于某种延迟中,或者从 setup()
函数中执行。
如果这不起作用,您可以尝试在延迟一段时间后以编程方式调整 JFrame 的大小。这非常骇人听闻,但是 "correct" 继续进行的方法是更新您的 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
and/or sketch
没有呈现到适当的位置。有时它们在右边大约是框架大小的一半,有时我只看到框架中草图的底部。
用鼠标调整框架大小后,一切看起来都很好。我想将 JFrame 设置为 undecorated
,但无法调整 windows 的大小以将所有内容都放置到位。
这就是我试图解决的问题:
JFrame.repaint()
此处建议:Java items appear only after the window is resize。 - 没有效果。我想我可以手动调整 window 的大小,然后更改为
undecorated
。继这个问题的答案:Modifying a JFrame from within a Listener。但是处理草图崩溃了,因为我必须dispose
JFrame。
还有其他想法吗?
这听起来像是线程问题。处理使用它自己的动画线程,所以我对你遇到问题并不感到惊讶,而且它们是零星的我并不感到惊讶。这就是线程的本质。
事实上,最新版本的 Processing 删除了像这样将 Processing sketch 添加到 Swing 应用程序的功能。如果你真的想解决这个问题,你应该更新到最新版本的 Processing 并将其用作 Java 库。这需要更多工作,但比继续采用这种旧方法 "correct" 更重要。
但是因为我知道这不是您想听到的,所以我尝试的第一件事就是调用 JFrame.revalidate()
函数。您必须在 Processing sketch 初始化后执行此操作,这对于上述线程问题可能会很棘手。您可能必须将其置于某种延迟中,或者从 setup()
函数中执行。
如果这不起作用,您可以尝试在延迟一段时间后以编程方式调整 JFrame 的大小。这非常骇人听闻,但是 "correct" 继续进行的方法是更新您的 Processing 并停止以旧方式嵌入它。