将Processing 3添加到JPanel中

9
我正在尝试在swing应用程序窗口中的Jpanel中显示processing 3草图。(我正在使用eclipse) 请帮忙!
我需要基于swing的GUI的复杂性和功能,同时也想要processing的用户友好性,以创建应用程序中的可视化内容。
我已经使用了Kevin非常有帮助的答案,并创建了一个更具体的问题。谢谢Kevin!
我希望processing草图是从MainGUI.java调用的子类,并插入到JPanel中。我遇到的问题是eclipse说pt.initSurface()不可见。
再次感谢您的帮助。
MainGUI.java
import processing.awt.PSurfaceAWT;
import processing.awt.PSurfaceAWT.SmoothCanvas;
import processing.core.PApplet;
import processing.core.PSurface;
import processing.opengl.*;
import processing.data.*;
import processing.event.*;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;

import patterns.ProcessingTest;

import java.awt.BorderLayout;
import javax.swing.JButton;

public class MainGUI {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainGUI window = new MainGUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public MainGUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JPanel panel = new JPanel();
        panel.setBounds(52, 24, 110, 143);

        //create your sketch
        ProcessingTest pt = new ProcessingTest();

        //get the PSurface from the sketch
        PSurface ps = pt.initSurface();

        //initialize the PSurface
        ps.setSize(200, 200);

        //get the SmoothCanvas that holds the PSurface
        SmoothCanvas smoothCanvas = (SmoothCanvas)ps.getNative();

        panel.setSize(200, 200);

         //SmoothCanvas can be used as a Component
        panel.add(smoothCanvas);
        frame.getContentPane().add(panel);

        //start your sketch
        ps.startThread();

    }
}

ProcessingTest.java

package patterns;

import javax.swing.JFrame;

import processing.awt.PSurfaceAWT.SmoothCanvas;
import processing.core.PApplet;
import processing.core.PSurface;

public class ProcessingTest extends PApplet{

    public void settings(){
        size(200, 200);
    }

    public void draw(){
        background(0);
        ellipse(mouseX, mouseY, 20, 20);
    }

}

1
嗯,我想知道是否包括那些对你没有用的内容,可能有助于缩小适合你的范围... - Jonny Henly
11
我投票支持重新开放这个问题。请注意,它是一个**[tag:processing]**问题,不是纯Java问题。 Processing 2有将自身嵌入到“JFrame”中的能力。 Processing 3删除了该功能,这可能会非常令人困惑。这是一个完全有效的Processing问题,但有些人已经关闭了它,因为它听起来像一个模糊的Java问题。它不是。这是一个具体的Processing问题。 - Kevin Workman
1个回答

10
在 Processing 2 中,PApplet 扩展了 Applet,因此您可以将它嵌入到像 JPanel 这样的 AWTSwing Component 中。
从 Processing 3 开始,PApplet 不再扩展 Applet,因此您不能再将其嵌入为一个 Component
尽管如此,您仍然有三种选择: 选项1: 您是否真的需要嵌入 Processing sketch?
思考一下为什么需要嵌入 Processing Sketch。是否有其他办法?您可以使用一个 GUI 库在 Processing 中编写 GUI 代码。
您也可以从 Processing 中创建一个单独的 JFrame选项2: 您只需要从 Java 启动 Processing sketch 吗?
如果是这样,您只需调用 PApplet.main("YourSketchNameHere") 函数即可。这会告诉 Processing 启动您的 sketch,并处理窗口的创建、调用 setup(),以及启动 draw() 循环。
下面是一个可以从 eclipse 运行的小例子:
import processing.core.PApplet;

public class ProcessingTest extends PApplet{

    public void settings(){
        size(200, 200);
    }

    public void draw(){
        background(0);
        ellipse(mouseX, mouseY, 20, 20);
    }

    public static void main(String... args){
        PApplet.main("ProcessingTest");
    }
}

选项3: 你真的、真的、真的确定需要嵌入你的 PApplet 吗?

如果前两个选项不起作用,那么您仍然可以访问底层组件。 Processing 3 引入了一个 PSurface 类,该类包含组件。要嵌入您的草图,您必须获得其 PSurface,然后从 PSurface 中获取本机组件。这并不是很简单,但是可行:

import javax.swing.JFrame;

import processing.awt.PSurfaceAWT.SmoothCanvas;
import processing.core.PApplet;
import processing.core.PSurface;

public class ProcessingTest extends PApplet{

    public void settings(){
        size(200, 200);
    }

    public void draw(){
        background(0);
        ellipse(mouseX, mouseY, 20, 20);
    }

    public static void main(String... args){

        //create your JFrame
        JFrame frame = new JFrame("JFrame Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //create your sketch
        ProcessingTest pt = new ProcessingTest();

        //get the PSurface from the sketch
        PSurface ps = pt.initSurface();

        //initialize the PSurface
        ps.setSize(200, 200);

        //get the SmoothCanvas that holds the PSurface
        SmoothCanvas smoothCanvas = (SmoothCanvas)ps.getNative();

        //SmoothCanvas can be used as a Component
        frame.add(smoothCanvas);

        //make your JFrame visible
        frame.setSize(200, 200);
        frame.setVisible(true);

        //start your sketch
        ps.startThread();
    }
}

一旦您获得了本机组件,您可以像处理其他Swing组件一样处理它。

请注意,您必须事先知道从PSurface.getNative()函数返回哪种类型的本机组件。这取决于您使用的渲染器。默认渲染器使用SmoothCanvas,但其他渲染器使用其他本机组件。

还要注意,您必须初始化和启动您的草图。

如果可能,应尽量使用前两个选项,但如果您确实需要嵌入草图,则可以使用选项3。


感谢你的回答,Kevin。你提出了一些很好的观点,帮助我理解了我的问题。这是我第一次在stackoverflow上提问。现在我更好地理解了如何提问和浏览网站。根据你的答案,我编辑了我的问题。它应该更具信息性和特定性。谢谢。 - Luma
选项3是完全可行的。所有声称在processing3中嵌入画布到jframe不可能的人都是错误的。 - slumpyrat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接