如何在javafx中嵌入PApplet?

2024-07-04

所以我让我的处理代码在java中运行。但现在我想将它嵌入到我的 GUI 的 JavaFX 中。我怎样才能这样做呢? 我尝试使用以下代码,但它似乎不起作用。

 package testprocessing;
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import java.awt.Dimension;

import java.util.concurrent.*;
import processing.core.*;

public class JavaFxApplet extends Application {
    private PApplet applet = new MyProcessingSketch();
    private Dimension appletSize;

    @Override public void init() throws ExecutionException, InterruptedException {
        applet.init();

        FutureTask<Dimension> sizingTask = new FutureTask<>(() ->
            applet.getRootPane().getPreferredSize()
        );
        SwingUtilities.invokeLater(sizingTask);
        appletSize = sizingTask.get();
    }

    @Override public void start(Stage stage) {
        final SwingNode swingNode = new SwingNode();
        SwingUtilities.invokeLater(() ->
            swingNode.setContent(applet.getRootPane())
        );

        stage.setScene(
            new Scene(
                new Group(swingNode),
                appletSize.getWidth(), appletSize.getHeight(),
                Color.BLACK
            )
        );
        stage.show();
    }

    @Override public void stop() {
        applet.stop();
        applet.destroy();
    }

    public static void main(String[] args) {
         launch(args);
     }
}

我在 getRootPane() 处收到错误。你能建议一个替代方案吗?


背景

引入于处理3是一种 JavaFX 渲染模式,可以将 JavaFX 包含在我们的草图中。我们可以不从头开始创建自己的 JavaFX 窗口,然后将草图嵌入其中,修改由PApplet类构造的窗口当它在 JavaFX 模式下初始化时,在其中添加新的 JavaFX 元素。

在 JavaFX 模式下初始化期间,PApplet 类创建一个javafx.scene.canvas.Canvas对象并将其作为子对象添加到javafx.scene.layout.StackPane目的。然后,一个javafx.scene.Scene对象是用堆栈窗格对象作为参数。最后,PApplet 类创建一个javafx.stage.Stage对象并将其场景设置为scene对象,为我们提供 PApplet 实例 - 草图。

因此,就 JavaFX 元素而言,PApplet 窗口由以下层次结构中的四个元素初始化:Stage > Scene > StackPane > Canvas,其中canvas是草图的图形画布(即处理绘制的对象)。

创建我们自己的 GUI,我们可以添加任何javafx.scene.Node对象(这是 JavaFX 图形元素的超类)到堆栈窗格目的。或者你可以构建一个新的Scene,将Processing的画布添加到其中,并替换现有的Scene of the Stage.


什么似乎不起作用

如果不指定渲染模式,Processing默认为JAVA2D模式。在此模式下,PApplet 类创建一个 PApplet 实例java.awt画布和窗口的版本(ajava.awt.Canvas and java.awt.Frame分别)。理论上来说,可以投java.awt.Frame to a javax.swing.JFrame,将其嵌入到javafx.embed.swing.SwingNode对象,最后将其添加到 JavaFX 阶段。但是,我无法让它发挥作用。

还有P2D & P3D模式。在这些模式下,画布是com.jogamp.newt.opengl.GLWindow目的。再次,我尝试在 Swing Node 的帮助下将其嵌入com.jogamp.opengl.awt.GLJPanel,但尚未证明是成功的。


执行

在处理中初始化你的草图FX2D调用中的渲染模式size():

size([width], [height], FX2D);

然后,我们可以通过重复转换公开初始化期间创建的四个 JavaFX 元素:

final PSurfaceFX FXSurface = (PSurfaceFX) surface;

final Canvas canvas = (Canvas) FXSurface.getNative();
final StackPane stackPane = (StackPane) canvas.getParent();
final Scene scene = canvas.getScene();
final Stage stage = (Stage) canvas.getScene().getWindow();

我们现在可以选择如何添加 JavaFX 元素:

1)添加到现有的stackPane

我们可以添加 JavaFX 元素(javafx.scene.Node对象)到堆栈窗格它是在初始化期间使用以下方法创建的:

stackPane.getChildren().add(Node node);

2)创建新场景(推荐)

或者(推荐,除非您想要 stackPane 作为顶级对齐器),我们可以创建一个新的场景对象(而不是使用scene and 堆栈窗格初始化期间创建的对象)并向其中添加 JavaFX 元素。

Scene newscene = new Scene(new Group(canvas)); // simple group containing only the Processing canvas
stage.setScene(Scene scene);

在初始化期间,canvas' 尺寸绑定到堆栈窗格。如果我们希望在运行时更改窗口内处理画布的大小,则必须包括以下内容:

canvas.widthProperty().unbind();
canvas.heightProperty().unbind();

现在我们可以自由调用canvas.setHeight() and canvas.setWidth()调整 JavaFX 窗口(舞台)内的处理画布的大小。

Example

让我们添加一个javafx.scene.control.MenuBar到窗户。请注意,我正在初始化 JavaFX 元素initSurface()方法而不是在setup()方法,因为这样比较安全。

在此示例中,堆栈窗格被替换为javafx.scene.layout.VBox,首先,使菜单栏位于canvas第二,确保stage是启动时的正确高度(菜单栏高度和画布高度的总和)。

@Override
public void settings() {
    size(500, 500, FX2D);
}

@Override
protected PSurface initSurface() {

    PSurface surface = super.initSurface();

    final PSurfaceFX FXSurface = (PSurfaceFX) surface;
    final Canvas canvas = (Canvas) FXSurface.getNative(); // canvas is the processing drawing
    final Stage stage = (Stage) canvas.getScene().getWindow(); // stage is the window

    stage.setTitle("Processing/JavaFX Example");
    canvas.widthProperty().unbind();
    canvas.heightProperty().unbind();

    final MenuItem menuItem1 = new MenuItem("Fill green");
    menuItem1.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            noLoop();
            background(0, 255, 0); // Fills the canvas green on click
        }
    });

    final MenuItem menuItem2 = new MenuItem("Exit");
    menuItem2.setOnAction(actionEvent -> exit()); // Exit PApplet on click

    final Menu menu = new Menu("Menu");
    menu.getItems().add(menuItem1);
    menu.getItems().add(menuItem2);

    final MenuBar menuBar = new MenuBar();
    menuBar.getMenus().add(menu);

    final VBox vBox = new VBox(menuBar, canvas); // Menubar will sit on top of canvas
    final Scene newscene = new Scene(vBox); // Create a scene from the elements
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            stage.setScene(newscene); // Replace the stage's scene with our new one.
        }
    });
    return surface;
}

@Override
public void draw() {
    background(50);
    fill(0, 255, 0);
    strokeWeight(5);
    stroke(255, 5, 5);
    line(0, 0, width, 0); // shows us that window is the correct dimensions
    line(0, height, width, height); // shows us that window is the correct dimensions
    noStroke();
    ellipse(100, 100, 200, 200);
    fill(255, 0, 0);
    ellipse(100, 200, 200, 200);
    fill(0, 0, 255);
    ellipse(100, 300, 200, 200);
}

Result

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在javafx中嵌入PApplet? 的相关文章

  • 我的标准差计算可以更加高效吗?

    我很好奇我的标准差方法是否可以变得更有效 我所说的高效是指快速 而快速是指从方法调用到方法返回的延迟 这是代码 public double stdDev ArrayList
  • Java Web 应用程序的关闭钩子

    我需要在 java web 应用程序停止或 tomcat 停止时保存一些数据 如何才能做到这一点 编辑 如果我使用 jvm shutdown hook 有什么缺点吗 使用一个实现的类ServletContextListener https
  • Java中的相似字符串比较

    我想相互比较几个字符串 并找到最相似的字符串 我想知道是否有任何库 方法或最佳实践可以返回哪些字符串与其他字符串更相似 例如 狐狸跳得很快 gt 狐狸跳了 敏捷的狐狸跳了 gt 狐狸 该比较将返回第一个比第二个更相似 我想我需要一些方法 例
  • Java:什么是“for (;;)”[重复]

    这个问题在这里已经有答案了 有人可以帮我解释一下这条指令吗 为了 我遇到过几种这样的标记 比如在 facebook 的 ajax 代码和 Java 的并发内容中 无限循环 for 循环的三个部分中的每一个部分 for x y z 是可选的
  • 配置 Manuel 容器 IntelliJ Arquillian Wildfly

    我正在使用 intelliJ 运行 junit arquillian 测试 问题是我的测试适用于 maven 命令 但不适用于 arquillian mvn package P arq wildlfy managed 这是我的 pom
  • 杰克逊没有认识到存在的领域

    这是我的 JSON totalSize 46 done true records Name Wamu I Start Date c 2016 09 26T16 56 10 000 0000 Status c Completed Type c
  • 如何在运行时创建对象?

    我需要在运行时创建一个类的多个不同对象 这个数字也是在运行时确定的 就像我们在运行时得到 int no o objects 10 一样 然后我需要实例化一个类10次 Thanks 阅读Java 教程中的数组 http java sun co
  • Spring Data REST - @PrePersist 和 @HandleBeforeCreate 之间的区别?

    I use Spring Data Rest over JPA映射 JPA提供 PrePersist在数据库中持久化实体之前要调用的方法的注释 Spring Data Rest 提供 HandleBeforeCreate捕获实体创建事件时调
  • Glassfish 使用内部模块库而不是应用程序库

    我正在尝试在 Glassfish 4 1 21 上部署 Spring boot 应用程序 在启动时 我收到一条错误 指出由于方法不存在而无法创建entityManagerFactory 它不存在 因为由于某种原因 当应用程序在 glassf
  • “错误:在 Grad 类中找不到 Main 方法,请将 main 方法定义为:public static void main(String[] args)”

    我收到这条消息 通过java编译器 错误 在 Grad 类中找不到 Main 方法 请将 main 方法定义为 公共静态无效主 字符串 参数 这是我的 来自书中的 代码 class Grad String naziv nepoznat in
  • 隐藏另一个布局的浮动操作按钮

    我有一个FloatingActionButton五月之内activity main xml名为的布局fabBtn 我的应用程序是用ViewPager和三个Fragments 我想隐藏FloatingActionButton当我的第一次Fra
  • **线程“main”中的异常java.util.InputMismatchException**

    我正在尝试从 txt 文件中获取一些记录并将其放入以下 Java 程序的数据库中 package Java Demo import java sql import java util import java io public class
  • 通过解析异常获取方法名及其包含的参数

    当我收到异常时 例如IOException or RunTimeException 我只能知道班级里的行号 首先是我的问题 是否可以通过异常检索方法名称 其次 是否可以通过行号检索该方法以及该方法的参数 附注我需要知道确切的方法名称及其参数
  • 优化xstream的加载速度

    当我尝试从 XML 文件执行加载时 我感觉 xstream 加载速度达不到我的要求 为了 一个有 10k 条目的 数据库 需要几分钟 以下是我用来序列化的整个数据结构 列表的大小 符号和代码 将为 大约 10k 条目 有什么方法我可以尝试
  • Java 类卡枚举示例。修改

    任何帮助深表感谢 我正在使用 java 网站上的类卡示例来尝试构建游戏 http java sun com j2se 1 5 0 docs guide language enums html http java sun com j2se 1
  • 为什么我无法初始化 Map? [复制]

    这个问题在这里已经有答案了 我想存储一组int String值 但是ints 不一定是增量的 这意味着数据可以是 lt 1 first gt lt 3 second gt lt 9 third gt 所以我正在尝试创建与Dictionary
  • 使用 v8::Locker 的正确方法是什么?为什么必须使用它?

    我正在尝试使用 NDK 将 v8 嵌入到 Android 应用程序中 我有一个看起来像这样的 JNI 模块 未显示 JNI 映射代码 include
  • GWT 的图表和绘图 API

    我正在尝试找到一个可以在 GWT 中使用 java 而不是 javascript 使用的图表和绘图 api 我遇到的唯一问题是我发现需要互联网连接的代码将无法连接到互联网 有谁知道这样的API吗 这是我找到的 但又无法使用 https co
  • 避免 xjc 生成的代码出现编译器警告

    我的根本问题是如何从 未经检查的泛型类型 Eclipse 编译器警告中受益 但问题视图中没有这些警告列表 这些警告被 xjc 从 xsd 文件生成的 java 类的噪声污染 通过 maven jaxb2 插入 我读过其他地方 我可以忽略每个
  • 您使用哪种 IDE(如果有)构建 python GUI 项目?

    是否有任何 IDE 如 VS 支持拖放来构建 python GUI 连接到数据库等 尽管我是一个 emacs 爱好者 但我发现使用 VS 创建 GUI 更容易 仅对于 GUI 我发现 VisualWx http visualwx alter

随机推荐

  • 在 AWS Amplify 控制台上部署为 SPA 后,Nuxtjs 动态路由在页面重新加载时不起作用

    我已使用 AWS Amplify 控制台在 AWS 上将 Nuxtjs 应用程序部署为 SPA 现在我的网站有一些动态路由 当重新加载或在新选项卡中打开时 它们会重定向到 404 页面 我知道当我们使用生成静态站点时nuxt generat
  • 不要在 iOS 上显示蜂窝数据警告

    如果用户决定不允许应用程序在每次尝试打开应用程序时访问蜂窝数据 则会显示一条警告 告诉他们蜂窝数据已关闭 SDK中有没有办法停止显示此消息或控制其显示的时间 位置 如果您在权限被撤销的情况下尝试访问互联网 系统将显示此消息 为了防止它出现
  • 如何在 Python 3 中使用 smtplib.sendmail() 对收件人姓名(而不是地址)中的国际字符进行编码?

    我在 Python 3 程序中使用标准 smtplib sendmail 调用来发送电子邮件 如下所示 smtp session sendmail The Sender lt email protected cdn cgi l email
  • 暂停 RTMP 直播流后 VideoJS 不播放

    我正在使用 VideoJS 从 Wowza 服务器进行实时流 但是当我暂停播放器并再次播放时 播放器不会恢复流 我需要重新加载网页才能再次启动流
  • 在 X11 中以快速帧速率捕获 OpenGL 窗口 - 可能吗?

    我有一个大小为 800x600 的 OpenGL 应用程序在我的 Linux 机器 X11 上运行 该应用程序的内容 渲染的图像 应通过网络导出到另一台电脑 首先 我想知道是否可以以大约 30 Hz 的频率拍摄应用程序窗口的快照 将它们保存
  • jQuery 循环淡入淡出两个图像!

    我无法弄清楚如何让简单的淡入淡出循环发挥作用 正如你所见 我对 jQuery 还很陌生 我已经尝试过 但现在需要很长时间才能解决 所以我想我应该寻求一些帮助 我想做的事 我有两个图像 id 为 img1 和 img2 我希望图像 1 淡入
  • 两行标题的填充

    这有点难以解释 如果有人知道更好的标题 请继续更改它 我想在标题后面画一个黑框 我正在使用 h 标签内的跨度来执行此操作 它需要向左和向右一点填充 我的布局是响应式的 因此标题可能会分成两行 div class headline black
  • ipython:如何设置终端宽度

    当我使用ipython terminal并想要打印一个numpy ndarray它有很多列 行会在大约 80 个字符处自动断行 即行的宽度为 cca 80 个字符 z zeros 2 20 print z 据推测 ipython 预计我的终
  • Kivy:如何在树视图中使用 on_key_down 和 on_key_up 键盘事件?

    我在用python 2 7 and kivy 1 10 0 当我点击nameTextInput 然后树视图显示 我希望选择标签up and down键 并且当enter按下键 文本被复制 所选文本被复制到初始表单 就像您单击该项目时当前完成
  • 在派生虚函数中强制执行正确的参数类型

    我发现很难非常简洁地描述这个问题 所以我附上了演示程序的代码 总的想法是 我们需要一组派生类 它们被迫从基类实现一些抽象 Foo 函数 每个派生的 Foo 调用都必须接受不同的参数作为输入 但所有参数也应该从 BaseInput 类派生 到
  • 如何从张量流中的两个张量创建字典?

    我有两个张量 一个用于键 一个用于值 我正在尝试从它们创建一个字典 以便我可以使用创建的字典来更新另一个字典update 功能 我怎样才能实现这个 我不是在寻找tf contrib lookup HashTable 我尝试过使用tf map
  • 如何加快 AWS Fargate 上的部署速度?

    从 EC2 集群实例迁移到 AWS Fargate 后 我意识到部署需要更长的时间 以前需要 1 2 分钟 现在某些部署最多需要 5 分钟 这个帖子 https datree io blog migrating to aws ecs far
  • 以编程方式另存为 PowerPoint 2003 中的 PowerPoint 2007 (pptx)

    我需要能够将 PowerPoint 2003 中的演示文稿 以编程方式 保存为 OpenXML pptx 我安装了 Microsoft Office 兼容包 这确实允许我从 PowerPoint 2003 执行 另存为 PowerPoint
  • ModuleNotFoundError:没有名为“binance.client”的模块; “binance”不是一个包

    嘿 我是 Stack Over Flow 和 Python 的新手 但想学习并希望有人可以帮助我 我正在尝试在 python 中开发一个币安交易机器人 请参阅下面我的脚本 from binance client import Client
  • VS Code,更改调试器的 NodeJS 版本

    我想将 VS Code 的 NodeJS 版本从 4 5 0 更改为 7 7 2 专门针对不同的项目 我在Mac上使用nvm 并且我有上面提到的两个版本 它们用于不同的项目 尽管我可以使用 nvm 从终端进行更改 但 VS Code 使用默
  • 如何扩展 C# 内置类型,例如 String?

    我需要Trim a String 但我想删除字符串本身内所有重复的空格 而不仅仅是在其末尾或开头 我可以用这样的方法来做到这一点 public static string ConvertWhitespacesToSingleSpaces s
  • C#:秒到分钟到小时的转换?

    好吧 首先 我很确定我不会在这项作业中使用 TimeSpan 相反 当用户在文本框中输入秒数时 它会在消息框中显示秒 分钟和小时的公式系列 这就是我被困住的地方 我们应该用这个例子来检查我们的答案 7565 秒是 2 小时 6 分 5 秒
  • 共享库卸载的钩子函数

    我想添加钩子函数 该函数将在卸载共享库时被调用 库在编译时链接 可以做这样的事吗 也许 gcc 有标志吗 我看到了在运行时加载库的类似解决方案 但它不符合我的期望 对于 Linux 系统 dlopen dlclose 手册页解释了如何将这样
  • 如何在 Blazor Web 程序集中检查客户端连接状态

    我有一个 Blazor webasemmbly 应用程序 它使用 asp net core 作为后端 使用 Blazor wasm 作为前端 我有一个类可以检查 HTTP 问题 例如 notfound BadReqest 和 public
  • 如何在javafx中嵌入PApplet?

    所以我让我的处理代码在java中运行 但现在我想将它嵌入到我的 GUI 的 JavaFX 中 我怎样才能这样做呢 我尝试使用以下代码 但它似乎不起作用 package testprocessing import javafx applica