2

在 PySide 中,您可以覆盖paintEvent()a 的方法QWidget来控制小部件在屏幕上的绘制方式。NodeJavaFX中是否有等价物?


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

我看过ImageView.javaand Canvas.java,但没有运气。ImageView正在使用 css,并且Canvas似乎正在使用已弃用的impl_方法做某事,对此我没有找到任何文档。

谢谢!

4

1 回答 1

2

一般而言,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);
    }
}
于 2016-06-23T17:55:46.647 回答