我最近正在处理(http://processing.org/),并希望找出是否有一个库可以帮助我创建两个不同的窗口,它们呈现同一场景的两个视图。还有什么方法可以直接从一个切换到另一个。
问问题
1097 次
2 回答
1
我不知道 Processing 是否存在这样的库,但是您可以根据最近的 Processing 论坛线程使用以下代码轻松创建两个窗口
import java.awt.Frame;
import java.awt.MouseInfo;
import java.awt.Point;
PFrame f;
secondApplet s;
void setup () {
size(500, 500);
PFrame f = new PFrame();
frame.setTitle("first window");
}
void draw () {
background(255);
s.background(0); // Second window background method
// .... //
}
public class PFrame extends Frame {
public PFrame() {
setBounds(0, 0, 500, 500);
s = new secondApplet();
setResizable(false);
add(s);
s.init();
show();
setTitle("second window");
}
}
public class secondApplet extends PApplet {
public void setup() {
size(500, 500);
}
public void draw() {
}
}
然后,您可以基于通用数据源和方法在每个窗口中创建图形。我不是专家,但我希望这可以帮助您开始您的项目。
请注意,G4P等 GUI 库也支持创建多个窗口。
编辑:评论相关代码:
//...//
int x=50;
void draw () {
rect(width/2,0,x,x);
s.rect(s.width/2,0,x+10,x+10);
}
//...//
于 2013-07-11T11:17:43.550 回答
1
这是一个快速而简单的示例:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.*;
ImagePanel view2;
PImage viewport2 = new PImage(400,400,RGB);
void setup(){
size(800,400,P3D);
noStroke();
frame.setSize(400,400);
frame.setTitle("view 1");
view2 = new ImagePanel((BufferedImage)viewport2.getNative());
JFrame v2 = new JFrame("view 2");
v2.setSize(400,400);
v2.add(view2);
v2.show();
}
void draw(){
background(0);
lights();
//view1
pushMatrix();
translate(200,200,0);
rotateX(45);
rotateY(map(mouseX,0,height,-PI,PI));
renderScene();
popMatrix();
//view2
pushMatrix();
translate(600,200,0);
rotateY(45);
rotateX(map(mouseX,0,height,-PI,PI));
renderScene();
popMatrix();
viewport2 = get(400,0,400,400);//fetch a screenshot from the invisible side (right side);
view2.setImage((BufferedImage)viewport2.getNative());
}
void renderScene(){
pushMatrix();
box(100);//and other elements here
popMatrix();
}
public class ImagePanel extends JPanel{
private BufferedImage image;
public ImagePanel(BufferedImage img) {
setImage(img);
}
public void setImage(BufferedImage img){
image = img;
this.repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}
有 3 件事要看:
- 生成单独的视图 - 注意草图大小实际上是双倍的,我使用 push/pop 调用来隔离变换并渲染相同的数据。也可以随意使用
camera()
和perspective()
函数。 - 生成帧。注意 Processing 使用我调整大小的 java.awt.Frame
frame.setSize()
并扩展 JPanel 以便我可以绘制到 Graphics 对象中。 - 更新图像:我使用 get(x,y,width,height) 在绘制/渲染循环结束时获取渲染场景的快照 PImage。PImage提供了一个
getNative()
返回 BufferedImage 表示的方法。这可以绘制到 java.awt.Graphics 实例中。我告诉自定义 JPanel 组件重新绘制以更新像素。
这种方法有点老套,但是您使用的是具有相同变量的相同草图,而不是两个 PApplet 实例。
于 2013-07-29T23:09:21.420 回答