Skip to main content
 首页 » 编程设计

user-interface中JavaFX 中的自定义节点绘制

2025年01月19日7飞鱼

在 PySide 中,您可以重写 QWidgetpaintEvent() 方法来控制小部件在屏幕上绘制的方式。 JavaFX 中是否有相当于 Node 的东西?


上下文:我需要一种在屏幕上显示自定义图像格式的方法。不断转换我的格式和 JavaFX 的 Image 以便我可以在 ImageView 中显示它,这对我来说太慢了,而且更困惑。

我查看了 ImageView.javaCanvas.java,但没有运气。 ImageView 使用 css,而 Canvas 似乎正在使用已弃用的 impl_ 方法执行某些操作,我没有找到相关文档。

谢谢!

请您参考如下方法:

一般来说,JavaFX 中的绘制机制转向了更加基于事件的方法。要遵循 JavaFX 方式,您可能应该查看 TimelineAnimationTimer并且仅在实际图像数据发生变化时更新显示。

但是,如果您愿意,您可以在 JavaFX 中使用旧的 Swing 方式:

public class MyPane extends Pane { 
    private final Canvas canvas; 
 
    public MyPane() { 
        canvas = new Canvas(getWidth(), getHeight()); 
        getChildren().add(canvas); 
        widthProperty().addListener(e -> canvas.setWidth(getWidth())); 
        heightProperty().addListener(e -> canvas.setHeight(getHeight())); 
    } 
 
    @Override 
    protected void layoutChildren() { 
        super.layoutChildren(); 
 
        GraphicsContext gc = canvas.getGraphicsContext2D(); 
 
        gc.clearRect(0, 0, getWidth(), getHeight()); 
 
        gc.setFill(Color.RED); 
        gc.fillRect(10, 10, getWidth() - 20, getHeight() - 20); 
 
        // Paint your custom image here: 
        gc.drawImage(someImage, 0, 0); 
    } 
} 

上面的代码与此 Swing 代码等效:

public class MyPanel extends JPanel { 
    private static final long serialVersionUID = -969772195113348076L; 
 
    @Override 
    protected void paintComponent(Graphics g) { 
        super.paintComponent(g); 
 
        g.clearRect(0, 0, getWidth(), getHeight()); 
 
        g.setColor(java.awt.Color.RED); 
        g.fillRect(10, 10, getWidth() - 20, getHeight() - 20); 
 
        // Paint your custom image here: 
        g.drawImage(someImage, 0, 0, null); 
    } 
}