(JavaFx项目)一个鼠标点击训练的小程序(五)

本文详细描述了如何在基于IT技术的交互模型中扩展多选功能,包括实现多选、删除、创建和橡皮筋-套索选择,以及对撤销重做和剪贴板功能的完善,以适应多选操作的适配。

目录

Part1拓展

拓展需求:

需求分步:

具体实现

1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展

2.实现ctrl+单击/“橡皮筋-套索”组合方法选择多个目标

3.最后对part2,part3中的撤销重做,剪切板等功能进行完善,实现对多选之后的操作的适配


 此部分是基于对第一部分功能的拓展!

Part1拓展

拓展需求:

1.1 用户可以添加/删除单个目标/从选择通过控制点击

1.2 用户可以使用讲座中讨论的“橡皮筋-套索”组合方法选择多个目标

1.2.1 简化使用橡皮筋或套索的决定,以选择更多的项目

1.3 用户可以通过按下控制键和使用橡皮带套索控制来添加/删除多个目标

1.4 当多个目标被选中时,操作会影响所有选中的项目(移动,调整大小,删除)

需求分步:

1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展

2.实现ctrl+单击/“橡皮筋-套索”组合方法选择多个目标

3.最后对part2,part3中的撤销重做,剪切板等功能进行完善,实现对多选之后的操作的适配

具体实现

1.实现多选的功能,包括多选之后的删除,创建,方法缩小都得进行进行拓展

思路:实现多选功能就肯定需要一个列表对选中的目标进行存储,但之前的单选也应该保留,所以我就想到普通单选和多选可以分开存储,那么就必须保证单选和多选不会起冲突(不可以同时有单选和多选两种情况)

实现方法:

1.在iModel类中添加多选列表,并添加相关方法,包括增删改查以及Blob是否在列表中等方法。

public class InteractionModel {
  
	  Blob selected;
  	// 多选列表
    List<Blob> selectedBlobs = new ArrayList<>();
   
    public void setSelected(Blob b) {
        clearSelectedBlobs();
        selected = b;
        notifySubscribers();
    }

    public void unselect() {
        selected = null;
        notifySubscribers();
    }

    public Blob getSelected() {
        return selected;
    }

    // 多选列表操作的相关方法
    public void setSelectedBlobs(List<Blob> blobs){
        selectedBlobs = blobs;
        notifySubscribers();
    }

    public void addSelectedBlobs(Blob blob){
        selectedBlobs.add(blob);
        notifySubscribers();
    }

    public void deleteSelectedBlob(Blob blob){
        Iterator<Blob> it = selectedBlobs.iterator();
        while (it.hasNext()) {
            Blob s = it.next();
            if (blob.equals(s)) {
                it.remove();
            }
        }
        notifySubscribers();
    }

    public void clearSelectedBlobs(){
        selectedBlobs.clear();
        notifySubscribers();
    }

    public List<Blob> getSelectedBlobs(){
        return selectedBlobs;
    }

    public boolean containedInSelected(Blob blob){
        Iterator<Blob> it = selectedBlobs.iterator();
        while (it.hasNext()) {
            Blob s = it.next();
            if (blob.equals(s)) {
                return true;
            }
        }
        return false;
    }
    
   
}

2.在View类中的画操作中添加对多选目标的显示

仅仅只需要对imodel的多选列表中的对象显示即可

public class BlobView extends StackPane implements BlobModelListener, IModelListener {
	private void draw() {
        gc.clearRect(0,0,myCanvas.getWidth(),myCanvas.getHeight());
        model.getBlobs().forEach(b -> {
          	// 仅仅只需要对imodel的多选列表中的对象显示即可
            if (b == iModel.getSelected() || iModel.containedInSelected(b)) {
                gc.setFill(Color.TOMATO);
            } else {
                gc.setFill(Color.BEIGE);
            }
            gc.fillOval(b.x-b.r,b.y-b.r,b.r*2,b.r*2);
            gc.setFill(Color.BLACK);
            gc.fillText(String.valueOf(b.getCount()), b.x-3,b.y+3);
        });
    }
}

3.修改controller类中的多选操作以及对单选与多选逻辑上修改即可

鼠标按压时,判断按压背景还是某个圆,是某个圆,则就是选择操作

选择 从是否按压Ctrl上可以区分为多选还是单选。

若是多选 则通过判断该圆是否被选中后 对圆进行选中/取消(为了分开单选和多选,在多选时就要将单选取消)

若是单选 若此时多选不为空(即正在进行多选操作,就单选不成功)

为空 就可以正常使用

之后的每一个增加,删除,修改操作都是对两种情况进行判断

若单选 正常操作即可

多选 对多个目标边里进行操作即可

public class BlobController {
    BlobModel model;
    InteractionModel iModel;
    double prevX,prevY;
    double dX,dY;

    enum State {READY,PREPARE_CREATE, DRAGGING, DRAGGING_TOOL}
    State currentState = State.READY;

    public void handlePressed(MouseEvent event) {
        switch (currentState) {
            case READY -> {
                if (model.hitBlob(event.getX(),event.getY())) {        // 选中⚪
                    Blob b = model.whichHit(event.getX(),event.getY());
                    // 对多选和单选就行区分
                    if (event.isControlDown()){
                        if (iModel.containedInSelected(b)){
                            iModel.deleteSelectedBlob(b);
                        }else {
                            iModel.addSelectedBlobs(b);
                            iModel.unselect();
                        }
                    }else if (iModel.getSelectedBlobs().isEmpty()){
                        iModel.setSelected(b);
                    }
                    prevX = event.getX();
                    prevY = event.getY();
                    currentState = State.DRAGGING;                    // 选中之后就改变状态为dragging
                } else {
                    if (event.isControlDown()){
                        iModel.clearPoints();
                        iModel.setPathComplete(false);
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值