Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javafx中绘制一条直线,在用户移动鼠标时自动更新?_Java_User Interface_Javafx - Fatal编程技术网

如何在javafx中绘制一条直线,在用户移动鼠标时自动更新?

如何在javafx中绘制一条直线,在用户移动鼠标时自动更新?,java,user-interface,javafx,Java,User Interface,Javafx,因此,我知道如何做自由手线,但我想要一条直线,因此当用户单击一个点到用户释放鼠标的点时,当用户拖动鼠标时,端点应随鼠标移动,即类似于在绘画应用程序中绘制直线 目前正在使用此代码: public class JavaFX_DrawOnCanvas extends Application { @Override public void start(Stage primaryStage) { Canvas canvas = new Canvas(400, 400);

因此,我知道如何做自由手线,但我想要一条直线,因此当用户单击一个点到用户释放鼠标的点时,当用户拖动鼠标时,端点应随鼠标移动,即类似于在绘画应用程序中绘制直线

目前正在使用此代码:

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);

    }

}
public类JavaFX\u drawncanvas扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
画布=新画布(400400);
final GraphicsContext GraphicsContext=canvas.getGraphicsContext2D();
initDraw(graphicsContext);
canvas.addEventHandler(MouseEvent.MOUSE_按下,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
graphicsContext.beginPath();
graphicsContext.moveTo(event.getX(),event.getY());
graphicsContext.stroke();
}
});
canvas.addEventHandler(MouseEvent.MOUSE_拖动,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
graphicsContext.lineTo(event.getX(),event.getY());
graphicsContext.stroke();
}
});
canvas.addEventHandler(MouseEvent.MOUSE_发布,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
}
});
StackPane root=新的StackPane();
root.getChildren().add(画布);
场景=新场景(根,400400);
setTitle(“java buddy.blogspot.com”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
私有void initDraw(GraphicsContext gc){
double canvasWidth=gc.getCanvas().getWidth();
double canvasHeight=gc.getCanvas().getHeight();
gc.setFill(颜色为浅灰色);
gc.设定行程(颜色为黑色);
gc.设置线宽(5);
gc.fill();
气相色谱法(
0,//左上角的x
0,//左上角的y
画布宽度,//矩形的宽度
画布高度);//矩形的高度
gc.setFill(颜色为红色);
gc.设定行程(颜色为蓝色);
gc.设置线宽(1);
}
}

如何修改鼠标拖动事件以绘制直线而不是徒手

一般来说,我同意您的意见-使用。 但使用canvas,您可以实现相同的效果,如下所示:

public class JavaFX_DrawOnCanvas extends Application {

    private Pair<Double, Double> initialTouch;
    private Canvas layer = new Canvas();

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();

        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) {
                        Canvas newLayer = new Canvas(400, 400);
                        GraphicsContext context = newLayer.getGraphicsContext2D();
                        initDraw(context);

                        layer = newLayer;
                        root.getChildren().add(0, newLayer);
                        initialTouch = new Pair<>(event.getSceneX(), event.getSceneY());
                    }
                });

        canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED,
                new EventHandler<MouseEvent>(){

                    @Override
                    public void handle(MouseEvent event) {
                        GraphicsContext context = layer.getGraphicsContext2D();
                        context.clearRect(0, 0, layer.getWidth(), layer.getHeight());
                        context.strokeLine(initialTouch.getKey(), initialTouch.getValue(), event.getSceneX(), event.getSceneY());
                    }
                });

        root.getChildren().add(canvas);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    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);

    }

    public static void main(String[] args) {
        launch(args);
    }

}
public类JavaFX\u drawncanvas扩展应用程序{
私人接触;
私有画布层=新画布();
@凌驾
公共无效开始(阶段primaryStage){
StackPane root=新的StackPane();
画布=新画布(400400);
final GraphicsContext GraphicsContext=canvas.getGraphicsContext2D();
initDraw(graphicsContext);
canvas.addEventHandler(MouseEvent.MOUSE_按下,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
画布新层=新画布(400400);
GraphicsContext上下文=newLayer.getGraphicsContext2D();
initDraw(上下文);
层=新层;
root.getChildren().add(0,newLayer);
initialTouch=新对(event.getSceneX(),event.getSceneY());
}
});
canvas.addEventHandler(MouseEvent.MOUSE_拖动,
新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
GraphicsContext上下文=layer.getGraphicsContext2D();
clearRect(0,0,layer.getWidth(),layer.getHeight());
strokeLine(initialTouch.getKey(),initialTouch.getValue(),event.getSceneX(),event.getSceneY());
}
});
root.getChildren().add(画布);
场景=新场景(根,400400);
初级阶段。场景(场景);
primaryStage.show();
}
私有void initDraw(GraphicsContext gc){
double canvasWidth=gc.getCanvas().getWidth();
double canvasHeight=gc.getCanvas().getHeight();
gc.setFill(颜色为浅灰色);
gc.设定行程(颜色为黑色);
gc.设置线宽(5);
gc.fill();
气相色谱法(
0,//左上角的x
0,//左上角的y
画布宽度,//矩形的宽度
画布高度);//矩形的高度
gc.setFill(颜色为红色);
gc.设定行程(颜色为蓝色);
gc.设置线宽(1);
}
公共静态void main(字符串[]args){
发射(args);
}
}

所以,基本上您需要为每条新线创建单独的层并使用它。请注意,新添加的层必须添加到根子级的0索引处,因为否则主画布的事件处理程序将停止处理事件。

一般来说,我同意您的意见-使用。 但使用canvas,您可以实现相同的效果,如下所示:

public class JavaFX_DrawOnCanvas extends Application {

    private Pair<Double, Double> initialTouch;
    private Canvas layer = new Canvas();

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();

        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) {
                        Canvas newLayer = new Canvas(400, 400);
                        GraphicsContext context = newLayer.getGraphicsContext2D();
                        initDraw(context);

                        layer = newLayer;
                        root.getChildren().add(0, newLayer);
                        initialTouch = new Pair<>(event.getSceneX(), event.getSceneY());
                    }
                });

        canvas.addEventHandler(MouseEvent.MOUSE_DRAGGED,
                new EventHandler<MouseEvent>(){

                    @Override
                    public void handle(MouseEvent event) {
                        GraphicsContext context = layer.getGraphicsContext2D();
                        context.clearRect(0, 0, layer.getWidth(), layer.getHeight());
                        context.strokeLine(initialTouch.getKey(), initialTouch.getValue(), event.getSceneX(), event.getSceneY());
                    }
                });

        root.getChildren().add(canvas);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    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);

    }

    public static void main(String[] args) {
        launch(args);
    }

}
public类JavaFX\u drawncanvas扩展应用程序{
私人接触;
私有画布层=新画布();
@凌驾
公共无效开始(阶段primaryStage){
StackPane root=新的StackPane();
画布=新画布(400400);
final GraphicsContext GraphicsContext=canvas.getGraphicsContext2D();
initDraw(graphicsContext);
canvas.addEventHandler(MouseEvent.MOUSE_按下,
新的EventHandler(){
@结束