У меня проблемы с получением JOGL canvas / panel в сцене JavaFX.Я предположил, что если JOGL GLCanvas придерживается контракта для awt.Canvas, не должно быть проблем с его размещением в сцене JFX.
Я собрал следующий код (все фрагменты находятся внутри JFX Application :: start).
Первое создание JOGL "Привет, мир" (пульсирующий фон, чтобы увидеть, как все движется и движется):
GLCanvas glCanvas = new GLCanvas();
glCanvas.setSize(size-10, size-10);
glCanvas.addGLEventListener(new GLEventListener() {
private final long t0 = System.currentTimeMillis();
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
@Override
public void init(GLAutoDrawable drawable) {
new Thread(() -> {while (true) glCanvas.display();}).start();
}
@Override
public void dispose(GLAutoDrawable drawable) {}
@Override
public void display(GLAutoDrawable drawable) {
GL4 gl = drawable.getGL().getGL4();
float t = (float)(Math.sin((System.currentTimeMillis()-t0)/1000f)+1)/2f;
gl.glClearColor(t, 1-t, 0, 1);
gl.glClear(GL4.GL_COLOR_BUFFER_BIT);
}
});
GLJPanel glPanel = new GLJPanel();
glPanel.add(glCanvas);
glPanel.setBackground(Color.BLUE);
Альтернативный привет, мир (не двигаясь, это явно работает):
Canvas awtCanvas = new Canvas() {
@Override
public void paint(Graphics g) {g.fillRect(0, 0, getWidth(), getHeight());}
};
awtCanvas.setSize(size-10, size-10);
JPanel swingPanel = new JPanel();
swingPanel.add(awtCanvas);
swingPanel.setBackground(Color.BLUE);
И тестовый код, объединяющий вещи:
if (jfx) {
SwingNode swingNode = new SwingNode();
swingNode.setContent(swingPanel);
primaryStage.setScene(new Scene(new Group(swingNode), size, size+30));
primaryStage.show();
} else {
JFrame frame = new JFrame();
frame.setSize(size, size+30);
frame.add(swingPanel);
frame.setVisible(true);
}
Эталонные решения JFrame (Panel (Canvas ())) , JFrame (JPanel (GLCanvas)())) и JFrame (GLJPanel (GLCanvas ())) работает должным образом (вроде как, GLPanel , похоже, игнорирует настройку цвета фона).
Когда я пытаюсь использовать не-JOGL оболочку Stage (Scene (Group (JPanel (Canvas ()))) * , работает должным образом (работает JFX).
Теперь для JOGL, оболочка Stage (Scene (Group (JPanel (GLJPanel (GLCanvas ())))) создает черный цвет там, где должно быть содержимое холста. Wrapper Stage (Scene (Group (JPanel (GLCanvas ()))) * (пропуская использование GLJPanel) не будет производить черный квадрат для содержимого холста, а я получаю только синий квадрат для JPanel.
Единственные упоминанияВ интернете я обнаружил, что в 2012/2013 гг. Кажется, что это не работает (но, похоже, SwingNode не существовал в то время), а также в 2016 г. на форумах JOGL, которые ссылаются на неработающую ссылку в bugzzila.