Вам нужно будет загрузить слегка измененный core.jar , чтобы это работало, где я изменил видимость нескольких членов классов PSurfaceFX
и PGraphicsFX2D
с Protected
до Public
.Изменения позволяют нам запускать JavaFX из нашего собственного класса ... extends Application
, сохраняя при этом доступ к элементам, которые Обработка должна установить во время запуска для работы.
Обработка 3 завершается сбоем в режиме FX2D, когда используется JDKвыше Java 8, поэтому я также сделал рабочую версию для 8+, так как для работы файлов FXML обычно требуется как минимум Java 9.
Это файл FXML, с которым я работаю в этом примере:
С измененным core.jar , добавленным к пути к классам вашего проекта, переопределите initSurface()
в вашем классе PApplet с помощью следующего фрагмента.С помощью этого кода мы пропускаем вызов PApplet к initFrame()
- здесь обработка создает свой собственный этап JavaFX, который мы не хотим делать.
@Override
protected PSurface initSurface() {
g = createPrimaryGraphics();
PSurface genericSurface = g.createSurface();
PSurfaceFX fxSurface = (PSurfaceFX) genericSurface;
fxSurface.sketch = this;
Launcher.surface = fxSurface;
new Thread(new Runnable() {
public void run() {
Application.launch(Launcher.class);
}
}).start();
while (fxSurface.stage == null) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
}
}
this.surface = fxSurface;
return fxSurface;
}
Установите режим рендеринга PApplet на FX2D, напримерИтак:
@Override
public void settings() {
size(0, 0, FX2D);
}
Поместите следующее или подобное в ваш класс Launcher.В этом примере я вручную нашел узел, в который я хочу добавить объект холста.Есть лучшие, более программные способы сделать это (например, .lookup () с использованием fx: id нужного узла).Я также связал размеры холста с размерами его родителя, поэтому, когда делитель, разделяющий панели Master и View , перетаскивается, холст соответственно изменяет размеры.
public class Launcher extends Application {
public static PSurfaceFX surface;
@Override
public void start(Stage primaryStage) throws Exception {
Canvas canvas = (Canvas) surface.getNative(); // boilerplate
GraphicsContext graphicsContext = canvas.getGraphicsContext2D(); // boilerplate
surface.fx.context = graphicsContext; // boilerplate
primaryStage.setTitle("FXML/Processing");
VBox root = FXMLLoader.load(new File("c:/Users/Mike/desktop/test.fxml").toURI().toURL());
SplitPane pane = (SplitPane) root.getChildren().get(1); // Manually get the item I want to add canvas to
AnchorPane pane2 = (AnchorPane) pane.getItems().get(0); // Manually get the item I want to add canvas to
pane2.getChildren().add(canvas); // Manually get the item I want to add canvas to
canvas.widthProperty().bind(pane2.widthProperty());
canvas.heightProperty().bind(pane2.heightProperty());
Scene scene = new Scene(root, 800, 800);
primaryStage.setScene(scene);
primaryStage.show();
surface.stage = primaryStage; // boilerplate
}
}
Это результат: