在 PySide 中,您可以重写 QWidget
的 paintEvent()
方法来控制小部件在屏幕上绘制的方式。 JavaFX 中是否有相当于 Node
的东西?
上下文:我需要一种在屏幕上显示自定义图像格式的方法。不断转换我的格式和 JavaFX 的 Image
以便我可以在 ImageView
中显示它,这对我来说太慢了,而且更困惑。
我查看了 ImageView.java
和 Canvas.java
,但没有运气。 ImageView
使用 css,而 Canvas
似乎正在使用已弃用的 impl_
方法执行某些操作,我没有找到相关文档。
谢谢!
请您参考如下方法:
一般来说,JavaFX 中的绘制机制转向了更加基于事件的方法。要遵循 JavaFX 方式,您可能应该查看 Timeline或AnimationTimer并且仅在实际图像数据发生变化时更新显示。
但是,如果您愿意,您可以在 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);
}
}