本文介绍了如何在JavaFX画布上用鼠标绘制连续线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面的代码会生成一个JavaFX Canvas,可以使用鼠标指针绘制但跳过某些点,即如果尝试绘制一条连续线,则留下间隙。随着指针速度的增加,间隙会加剧。
The code below results in a JavaFX Canvas that can be drawn on with the mouse pointer but skips some points, i.e., leaves gaps if one tries to draw a continuous line. The gapping intensifies as pointer speed increases.
导致此行为的原因是什么以及如何实现良好连接的线路? (注意,我正在寻找一个明确切换指针传递给黑色的每个像素的答案,而不是平滑或连接点等操作。)
public class DrawingSample extends Application {
public void start(Stage stage) {
FlowPane flowPane = new FlowPane();
Canvas canvas = new Canvas(300, 300);
flowPane.getChildren().add(canvas);
GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
graphicsContext.setFill(Color.WHITE);
graphicsContext.fillRect(0, 0, 300, 300);
canvas.setOnMouseDragged((event) -> {
graphicsContext.setFill(Color.BLACK);
graphicsContext.fillRect(event.getX(), event.getY(), 1, 1);
});
stage.setScene(new Scene(flowPane));
stage.show();
}
public static void main(String[] args) {
launch(DrawingSample.class);
}
}
下图演示了从左到右绘制的三条线我们下降时速度越来越快。
The following figure demonstrates three lines drawn from left to right at increasing speeds as we go down.
推荐答案
此代码来自。
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaFX_DrawOnCanvas extends Application {
@Override
public void start(Stage primaryStage) {
Canvas canvas = new Canvas(400, 400);
final GraphicsContext graphicsContext = canvas.getGraphicsContext2D();
initDraw(graphicsContext);
canvas.addEventHandler(MouseEvent.MOUSE_PRESSED,
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
graphicsContext.beginPath();
graphicsContext.moveTo(event.getX(), event.getY());
graphicsContext.stroke();
}
});
canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED,
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
graphicsContext.lineTo(event.getX(), event.getY());
graphicsContext.stroke();
}
});
canvas.addEventHandler(MouseEvent.MOUSE_RELEASED,
new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
}
});
StackPane root = new StackPane();
root.getChildren().add(canvas);
Scene scene = new Scene(root, 400, 400);
primaryStage.setTitle("java-buddy.blogspot.com");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private void initDraw(GraphicsContext gc){
double canvasWidth = gc.getCanvas().getWidth();
double canvasHeight = gc.getCanvas().getHeight();
gc.setFill(Color.LIGHTGRAY);
gc.setStroke(Color.BLACK);
gc.setLineWidth(5);
gc.fill();
gc.strokeRect(
0, //x of the upper left corner
0, //y of the upper left corner
canvasWidth, //width of the rectangle
canvasHeight); //height of the rectangle
gc.setFill(Color.RED);
gc.setStroke(Color.BLUE);
gc.setLineWidth(1);
}
}
这篇关于如何在JavaFX画布上用鼠标绘制连续线?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!