【发布时间】:2018-10-09 20:07:06
【问题描述】:
在 JavaFX 场景中获取 JOGL 画布/面板时遇到问题。我的假设是,如果 JOGL GLCanvas 遵守 awt.Canvas 的合同,那么将它放在 JFX 场景中应该没有问题。
我收集了以下代码(所有 sn-ps 都在 JFX Application::start 中)。
首次创建 JOGL“hello world”(脉动背景只是为了查看物体是否渲染和移动):
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())))) 在画布内容应该存在的地方生成黑色。包装器 Stage(Scene(Group( JPanel(GLCanvas())))(跳过使用 GLJPanel)不会为画布内容生成黑色方块,我只会为 JPanel 生成蓝色方块。
我在互联网上发现的唯一提及来自 2012/2013 年,它似乎不起作用(但当时似乎 SwingNode 不存在),以及 2016 年在 JOGL 论坛上链接到 bugzzila 中的死链接。
【问题讨论】:
-
即使它会起作用 - 性能也会非常非常糟糕。 JavaFX 需要获得 DirectRendering-Node 的真正解决方案,您可以在其中使用您想要绘制的任何技术(JOGL、LWJGL、Native ......)进行绘制。目前正在讨论如何实现这样的节点,所以订阅 openjfx-Mailing 列表(或者你可能想关注我的博客)看看这是否会实现
-
不如试试 NewtCanvasJFX(从 JOGL 2.4 开始):github.com/sgothel/jogl/blob/master/src/newt/classes/com/jogamp/…
标签: java swing javafx awt jogl