【JavaFx基础】在画布中画线框

一、需求描述

JavaFx项目中,实现用画布控件在画布中画线框

二、代码参考

package com.example.fxtest2;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.ImageCursor;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.input.Dragboard;
import javafx.scene.input.KeyCode;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.Objects;

public class HelloApplication extends Application {

    public static final double WIDTH=600,HEIGHT=500;
    private Canvas canvas=new Canvas(WIDTH,HEIGHT);
    private GraphicsContext graphicsContext=canvas.getGraphicsContext2D();
    private double x;//鼠标x点
    private double y;//鼠标y点
    private WritableImage image=null;//快照,保持前面所画框图
    @Override
    public void start(Stage stage) throws IOException {

        canvas.setLayoutX(0);
        canvas.setLayoutY(0);

        //graphicsContext.setLineWidth(10);//画框宽,10个像素
        //graphicsContext.setStroke(Color.GREEN);//画框边框颜色
        //graphicsContext.strokeRect(30,30,300,300);//画框大小
        //graphicsContext.setFill(Color.RED);//填充色
        // graphicsContext.fillOval(30,30,300,300);//填充圆
        canvas.setOnMousePressed(event->{//鼠标落点位置
            x=event.getX();
            y=event.getY();
        });
        canvas.setOnMouseDragged(event->{//在绘图区绘制框图
            double startx=x;
            double starty=y;
            double endx=event.getX();//获取鼠标移动位置的x
            double endy=event.getY();//获取鼠标移动位置的y
            if (endx<startx){//使框图可以从下往上画
                startx=endx;
                endx=x;
                starty=endy;
                endy=y;
            }
            double width=endx-startx;
            double height=endy-starty;
            graphicsContext.clearRect(0,0,WIDTH,HEIGHT);//清除中间的框图
            graphicsContext.drawImage(image,0,0,WIDTH,HEIGHT);
            graphicsContext.strokeRect(startx,starty,width,height);//鼠标移动哪里画哪里
        });
        canvas.setOnMouseReleased(event->{//快照,保持之前所画框图
            image=canvas.snapshot(null,null);
        });
        AnchorPane pane=new AnchorPane(canvas);
        Scene scene=new Scene(pane,800,600);
        stage.setScene(scene);
        //stage.setResizable(false);
        stage.setTitle("画图");
        stage.show();
        System.out.println("start()...");
    }

    @Override
    public void init() throws Exception {
        super.init();
        System.out.println("init()...");//先调用
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        System.out.println("stop()...");//窗口关闭自动调用
    }

    public static void main(String[] args) {

        launch();
    }

}

三、运行结果

技巧1、实现从下往上画图

if (endx<startx){//使框图可以从下往上画
                startx=endx;
                endx=x;
                starty=endy;
                endy=y;
            }

技巧2、清除不需要的线框

 graphicsContext.clearRect(0,0,WIDTH,HEIGHT);

技巧3、保存之前画的线框

canvas.setOnMouseReleased(event->{//快照,保持之前所画框图
            image=canvas.snapshot(null,null);
        });

 四、参考教程

https://www.bilibili.com/video/BV1Qf4y1F7Zv?p=14&vd_source=841fee104972680a6cac4dbdbf144b50

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林月明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值