JavaFX中的自定义节点绘制

时间:2014-06-12 12:36:26

标签: user-interface javafx paint paintevent

在PySide中,您可以覆盖paintEvent()的{​​{1}}方法,以控制窗口小部件在屏幕上的绘制方式。 JavaFX中是否有QWidget的等价物?


在上下文中:我需要一种在屏幕上显示自定义图像格式的方法。不断转换我的格式和JavaFX的Node所以我可以在Image中显示它对我来说太慢了,除了变得更加混乱。

我看过ImageViewImageView.java,但没有运气。 Canvas.java正在使用css,ImageView似乎正在使用已弃用的Canvas方法,我没有找到任何文档。

谢谢!

1 个答案:

答案 0 :(得分:1)

通常,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);
    }
}