- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我让我的处理代码在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() 处遇到错误。你能建议一个替代方案吗?
最佳答案
Processing 3 中引入了一种 JavaFX 渲染模式,可以将 JavaFX 包含在我们的草图中。我们可以在 JavaFX 模式下初始化 PApplet 类构造的窗口时修改它,在其中添加新的 JavaFX 元素,而不是从头开始创建我们自己的 JavaFX 窗口,然后将草图嵌入其中。
在 JavaFX 模式下初始化期间,PApplet 类创建 javafx.scene.canvas.Canvas
对象并将其作为子项添加到 javafx.scene.layout.StackPane
目的。然后,一个javafx.scene.Scene
对象是用 stackPane 对象作为参数构造的。最后,PApplet 类创建一个 javafx.stage.Stage
对象并将其场景设置为 scene 对象,为我们提供 PApplet 实例 - 草图。
因此,就 JavaFX 元素而言,PApplet 窗口使用以下层次结构中的四个元素进行初始化: <i>Stage > Scene > StackPane > Canvas</i>
,其中 Canvas 是草图的图形 Canvas (即处理绘制的对象)。
要创建我们自己的 GUI,我们可以添加任何 javafx.scene.Node
对象(这是 JavaFX 图形元素的父类(super class))到 stackPane 对象。或者,您可以构建一个新的场景,向其中添加处理 Canvas ,并替换舞台的现有场景。
如果不指定渲染模式,Processing默认为JAVA2D
模式。在此模式下,PApplet 类使用 java.awt
创建一个 PApplet 实例。 Canvas 和窗口的版本(分别为 java.awt.Canvas
和 java.awt.Frame
)。理论上,可以转换java.awt.Frame
到 javax.swing.JFrame
,将其嵌入 javafx.embed.swing.SwingNode
对象,最后将其添加到 JavaFX 阶段。但是,我没能让它发挥作用。
还有P2D
& P3D
模式。在这些模式下, Canvas 是 com.jogamp.newt.opengl.GLWindow
目的。再次,我尝试在 com.jogamp.opengl.awt.GLJPanel
的帮助下将其嵌入到 Swing 节点中。 ,但尚未证明是成功的。
在Processing's FX2D
中初始化您的草图调用 size()
中的渲染模式:
size([width], [height], <b>FX2D</b>);
然后我们可以通过重复转换公开初始化期间创建的四个 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 中:
stackPane.getChildren().add(Node node);
2) 创建新场景(推荐)
或者(推荐,除非您想要 stackPane 作为顶级对齐器),我们可以创建一个新的场景对象(而不是使用 scene 和 stackPane 对象在初始化期间创建的)并向其中添加 JavaFX 元素。
Scene newscene = new Scene(new Group(canvas)); // simple group containing only the Processing canvas
stage.setScene(Scene scene);
在初始化期间,canvas的尺寸会绑定(bind)到stackPane的尺寸。如果我们希望在运行时更改窗口内处理 Canvas 的大小,则必须包括以下内容:
canvas.widthProperty().unbind();
canvas.heightProperty().unbind();
现在我们可以自由调用canvas.setHeight()
和canvas.setWidth()
在 JavaFX 窗口(舞台)内调整处理 Canvas 的大小。
让我们添加一个 javafx.scene.control.MenuBar
到 window 。请注意,我正在 initSurface()
中初始化我们的 JavaFX 元素。方法而不是在setup()
内这样做方法,因为这样比较安全。
在此示例中,stackPane 被替换为 javafx.scene.layout.VBox
首先,让菜单栏位于 Canvas 之上;其次,确保启动时舞台的高度正确(菜单栏高度与 Canvas 高度之和) .
@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);
}
结果
关于java - 如何在javafx中嵌入PApplet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266274/
当我检查处理应用程序的日志文件时,我注意到在某个时刻它会重新启动应用程序,然后运行它直至完成。我注意到当我发布声明时会发生这种情况: size (wwidth, wheight, OPENGL); 其
大家好。我是一名新手程序员,正在 Eclipse 上使用processing.core.PApplet 学习 Java。该项目在谷歌地图上可视化地震/主要城市/机场。我创建了一个“控制窗口”,允许用户
我有一个Processing我有一个用 Java 编写的草图(不是处理 IDE),我想将其嵌入到一个可以由 Web 浏览器的 java 插件运行的 Java 小程序中。处理草图是通过扩展一个名为 PA
我有一个 Eclipse Java 项目,其中有一个 src/demo 包,其中包含一个处理演示,位于扩展 PApplet 的单个类中。该演示在 Eclipse 中运行良好。 我希望演示这个包,最好是
我希望能够从可序列化类中引用 PApplet,而不必扩展 PApplet 或将其传递到构造函数中。是否有可能做到这一点?这是我失败的尝试: import java.io.*; static PAppl
我对 Java 很陌生,所以我想使用 PApplets 和 NetBeans 制作一个简单的示例项目: 我希望它看起来像: 但它看起来像: 我不知道如何为其添加颜色,当我尝试使用相同的字体(IBM P
我在尝试将 PApplet 添加到 SWT 时遇到问题,当它应该只渲染 PApplet 时,它会显示一个空窗口。 IE。 PApplet 可以单独工作,但不能在 SWT 窗口中工作。 我认为只需将 P
这是代码: import processing.core._ import PConstants._ import PApplet._ class PApp extends PApplet{ ar
在使用Processing 的Java servlet 中,我希望它将PApplet 的内容渲染到BufferedImage 并从中生成PNG 图像。从 PApplet 的内容创建 BufferedI
我有一个任务,我必须通过 PApplet 处理器显示“健身房机器”及其数据。我需要使用多态和继承(运行机是 GymMachine 等)。每个健身房机器必须有自己的绘制方法。我只是不知道如何避免 Nul
有什么方法可以设置 PApplet 的默认关闭操作? 我试图将 PApplet 嵌入到 JFrame 中,但它无法正确初始化,我需要将窗口设置为在退出时不关闭,在 JFrame 中我可以将其设置为 D
我正在尝试使用 IntelliJ 上的处理和 OpenKinect 库来连接我的 Kinect 以使用它进行手部检测,此代码适用于处理 3,但由于某种原因,当我以正确的格式将其放在 IntelliJ
我正在编写一个java应用程序,我想通过包含处理库来嵌入处理草图。我已经编写了处理草图,但现在我想将其作为我的更大程序的一部分。有没有一种方法可以通过“常规”java应用程序使用public stat
我一直在与 Unfolding Maps 合作库,这个库使用PApplet来显示 map 。我的问题是我试图在 PApplet 之上放置一个 JPanel(Swing 组件)。我能够将 JPanel
我正在尝试在我的 Java 代码中使用以 Processing 编写的此 SDK(适用于 IntelRealSense 摄像头)。我所做的是我拿了java源代码并用它做了一个项目。因此,我可以使用处理
我一直在尝试将 PApplet 粘贴到 JFrame 中,并在用户更改 JFrame 的大小时调整其大小,但文档(如果存在)不清楚。 Here我被告知要使用 void setup() { fram
我正在处理一个在不同窗口中运行的处理程序。在控制 Controller 上,这是主要的 PApplet,另一个正在运行一些 OpenGL,也是 PApplet 的子类。 创建 OpenGL 窗口的实例
所以,我正在使用 Eclipse 和处理来用 Java 进行一些较繁重的编码,但是我的派生类遇到了一些问题 - 我有一个直方图类,其成员变量parent是运行该程序的主要PApplet。处理已经有一个
在 Netbeans 中工作,包含了processing.core 导入,我试图在方法中执行类似以下的操作... PApplet pbase = new PApplet(); PImage img
我开发了一个基本的Processing PApplet 作为 Arduino IDE 中的工具运行在 Arduino 1.5.8 之前都运行良好。我遇到的问题是,在 Arduino 1.6.0 中,一
我是一名优秀的程序员,十分优秀!