将 java 中的剪辑替换为 FXGraphics2D (Java.awt)
Replacing clip in java with FXGraphics2D (Java.awt)
所以我正在使用 java 的 FXGraphics2D 应用程序,其中您有一个形状被剪裁,并且您会在背景中看到随机生成的彩色线条背景。一切顺利,但后来我想添加用鼠标移动剪辑形状的功能。
在本例中为鼠标点击 canvas 或拖动的位置。您不必在形状上拖动 FYI。
删除剪辑或仅清除 canvas 似乎有一个问题。现在因为我对 FXGraphics2D 很陌生,但我自己无法在文档或互联网上的任何地方找到它。
有谁知道如何解决从剪辑中独立清除 canvas 或以某种方式替换剪辑的问题?
提前致谢!
点击后的当前状态:
https://i.stack.imgur.com/dPbqI.png
在我看来,FXGraphics2D 将下一个剪辑放在旧剪辑之后。
我目前的代码;
绘制
public void draw(FXGraphics2D graphics) {
graphics.setTransform(new AffineTransform());
graphics.setBackground(Color.white);
graphics.clearRect(0, 0, (int)canvas.getWidth(), (int)canvas.getHeight());
graphics.setPaint(Color.black);
graphics.draw(clippingEllipse.getShape());
graphics.clip(clippingEllipse.getShape());
Set<Line> lineSet = Line.getLineSet(1000,1920,1080);
for (Line line : lineSet){
graphics.setPaint(line.getColor());
graphics.drawLine(line.getX1(), line.getY1(), line.getX2(), line.getY2());
}
}
Handle(调用 setOnMousePressed() 和 setOnMouseDragged() 的方法)
private void handle(MouseEvent event) {
this.clippingEllipse.setX((int) event.getX() - this.clippingEllipse.getWidth() / 2);
this.clippingEllipse.setY((int) event.getY() - this.clippingEllipse.getWidth() / 2);
}
开始
this.clippingEllipse = new ClippingEllipse(1920/2-100, 1080/2-100, 200);
BorderPane mainPane = new BorderPane();
canvas = new ResizableCanvas(g -> draw(g), mainPane);
mainPane.setCenter(canvas);
FXGraphics2D g2d = new FXGraphics2D(canvas.getGraphicsContext2D());
new AnimationTimer() {
long last = -1;
@Override
public void handle(long now) {
if(last == -1)
last = now;
update((now - last) / 1000000000.0);
last = now;
draw(g2d);
}
}.start();
canvas.setOnMousePressed(event -> handle(event));
canvas.setOnMouseDragged(event -> handle(event));
stage.setScene(new Scene(mainPane));
stage.setFullScreen(true);
stage.setTitle("Spotlight");
stage.show();
draw(g2d);
我为感兴趣的人找到的解决方案;
graphics.clip(clippingEllipse.getShape());
到
graphics.setClip(clippingEllipse.getShape());
&
在draw()方法的末尾添加这个;
graphics.clip(null);
编辑:
也有可能:graphics.setClip(null);
所以我正在使用 java 的 FXGraphics2D 应用程序,其中您有一个形状被剪裁,并且您会在背景中看到随机生成的彩色线条背景。一切顺利,但后来我想添加用鼠标移动剪辑形状的功能。
在本例中为鼠标点击 canvas 或拖动的位置。您不必在形状上拖动 FYI。
删除剪辑或仅清除 canvas 似乎有一个问题。现在因为我对 FXGraphics2D 很陌生,但我自己无法在文档或互联网上的任何地方找到它。
有谁知道如何解决从剪辑中独立清除 canvas 或以某种方式替换剪辑的问题?
提前致谢!
点击后的当前状态: https://i.stack.imgur.com/dPbqI.png 在我看来,FXGraphics2D 将下一个剪辑放在旧剪辑之后。
我目前的代码;
绘制
public void draw(FXGraphics2D graphics) {
graphics.setTransform(new AffineTransform());
graphics.setBackground(Color.white);
graphics.clearRect(0, 0, (int)canvas.getWidth(), (int)canvas.getHeight());
graphics.setPaint(Color.black);
graphics.draw(clippingEllipse.getShape());
graphics.clip(clippingEllipse.getShape());
Set<Line> lineSet = Line.getLineSet(1000,1920,1080);
for (Line line : lineSet){
graphics.setPaint(line.getColor());
graphics.drawLine(line.getX1(), line.getY1(), line.getX2(), line.getY2());
}
}
Handle(调用 setOnMousePressed() 和 setOnMouseDragged() 的方法)
private void handle(MouseEvent event) {
this.clippingEllipse.setX((int) event.getX() - this.clippingEllipse.getWidth() / 2);
this.clippingEllipse.setY((int) event.getY() - this.clippingEllipse.getWidth() / 2);
}
开始
this.clippingEllipse = new ClippingEllipse(1920/2-100, 1080/2-100, 200);
BorderPane mainPane = new BorderPane();
canvas = new ResizableCanvas(g -> draw(g), mainPane);
mainPane.setCenter(canvas);
FXGraphics2D g2d = new FXGraphics2D(canvas.getGraphicsContext2D());
new AnimationTimer() {
long last = -1;
@Override
public void handle(long now) {
if(last == -1)
last = now;
update((now - last) / 1000000000.0);
last = now;
draw(g2d);
}
}.start();
canvas.setOnMousePressed(event -> handle(event));
canvas.setOnMouseDragged(event -> handle(event));
stage.setScene(new Scene(mainPane));
stage.setFullScreen(true);
stage.setTitle("Spotlight");
stage.show();
draw(g2d);
我为感兴趣的人找到的解决方案;
graphics.clip(clippingEllipse.getShape());
到
graphics.setClip(clippingEllipse.getShape());
&
在draw()方法的末尾添加这个;
graphics.clip(null);
编辑:
也有可能:graphics.setClip(null);