目录
项目需求

Part3
需求分析
实现流程:
总的来说就是实现剪切板功能
3.1 如果有选择,按Control-X键将选择的项目放在应用程序的剪贴板上,并从模型中删除它们
3.2 如果有选择项,按Control-C键将选择项的副本放到应用程序的剪贴板上(而不是删除它们)
3.2.1 同一时间只能在剪贴板中包含一个项目集合;如果用户复制第二个选择,则丢弃第一个选择
3.3 从剪贴板上按Control-V将剪贴板中项目的副本放入模型中
3.3.1 用户可以多次粘贴剪贴板中的项目
优化:
3.4 剪切和粘贴的操作应该是可撤销的
3.5 被粘贴的项目在被粘贴时成为选中的; 不选择任何现有的选择
项目实现
实现剪切板功能
实现方法:
1.创建Clipboard类(剪切板类),用于存储剪切板的内容并提供添加剪切内容,粘贴等方法
注意:该类中的Blob对象应该是单独复制出来,而不是简单的赋值进去,因为剪切板剪切的Blob与被剪切对象应该是两个对象,不然复制粘贴时操作可能是同一个Blob
2.在InteractionModel.java类中添加剪切板,并添加设置与获取剪切板内容接口
3.设置全局快捷键以及快捷键方法体
4.优化:
3.4 剪切和粘贴的操作应该是可撤销的
3.5 被粘贴的项目在被粘贴时成为选中的; 不选择任何现有的选择
实现:
1.创建Clipboard类(剪切板类),用于存储剪切板的内容并提供添加剪切内容,粘贴等方法
注意:该类中的Blob对象应该是单独复制出来,而不是简单的赋值进去,因为剪切板剪切的Blob与被剪切对象应该是两个对象,不然复制粘贴时操作可能是同一个Blob
BlobClipboard.java
public class BlobClipboard {
private Blob blob;
public BlobClipboard(){
this.blob = new Blob();
}
public BlobClipboard(Blob blob) {
// 复制过程
this.blob.setX(blob.getX());
this.blob.setY(blob.getY());
this.blob.setR(blob.getR());
}
public boolean isEmpty(){
return blob == null;
}
public void addToClipboard(Blob blob){
// 复制过程
this.blob.setX(blob.getX());
this.blob.setY(blob.getY());
this.blob.setR(blob.getR());
}
public Blob copy(){
// 随机生成
// double randX = (Math.random()+0.1)*800,
// randY = (Math.random()+0.1)*600;
// this.blob.setX(randX);
// this.blob.setY(randY);
// 固定出现在右后方
this.blob.setX(this.blob.getX() - 70);
this.blob.setY(this.blob.getY() - 70);
return blob;
}
}
2.在InteractionModel.java类中添加剪切板属性 ,并设置set/get方法
InteractionModel.java
public class InteractionModel {
List<IModelListener> subscribers;
Blob selected;
// 剪切板
BlobClipboard blobClipboard;
Stack<BlobAction> undoStack = new Stack<BlobAction>();
Stack<BlobAction> redoStack = new Stack<BlobAction>();
public BlobClipboard getBlobClipboard() {
return blobClipboard;
}
public void setBlobClipboard(BlobClipboard blobClipboard) {
this.blobClipboard = blobClipboard;
}
}
3.设置全局快捷键以及快捷键方法体
1.设置全局快捷键方法和part2中的一样,就是再添加几个
HelloApplication.java
public void setShortCuts(Scene scene, MainUI uiRoot){
// ctrl_Z 撤销
KeyCombination ctrl_z = new KeyCodeCombination(KeyCode.Z, KeyCombination.CONTROL_DOWN);
scene.getAccelerators().put(ctrl_z, () -> {
uiRoot.getController().handleUndo();
});
// ctrl_R 重做
KeyCombination ctrl_R = new KeyCodeCombination(KeyCode.R, KeyCombination.CONTROL_DOWN);
scene.getAccelerators().put(ctrl_R, () -> {
uiRoot.getController().handleRedo();
});
// ctrl_X 剪切
KeyCombination ctrl_X = new KeyCodeCombination(KeyCode.X, KeyCombination.CONTROL_DOWN);
scene.getAccelerators().put(ctrl_X, () -> {
uiRoot.getController().handleCut();
});
// ctrl_C 复制
KeyCombination ctrl_C = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_DOWN);
scene.getAccelerators().put(ctrl_C, () -> {
uiRoot.getController().handleCopy();
});
// ctrl_V 剪切
KeyCombination ctrl_V = new KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN);
scene.getAccelerators().put(ctrl_V, () -> {
uiRoot.getController().handlePaste();
});
}
2.添加快捷键方法
CTRL_X:将当前选中的圆添加到剪切板中并删除
CTRL_C:将当前选中的圆添加到剪切板中
CTRL_X:将剪切板中保存的对象再添加到页面中
BlobController.java
public void handleCut() {
// Ctrl_X
iModel.getBlobClipboard().addToClipboard(iModel.getSelected());
model.deleteBlobs(iModel.getSelected());
}
public void handleCopy(){
// Ctrl_C
iModel.getBlobClipboard().addToClipboard(iModel.getSelected());
}
public void handlePaste(){
// Ctrl_V
Blob blob = iModel.getBlobClipboard().copy();
Blob addBlob = model.addBlob(blob.getX(), blob.getY(), blob.getR());
}
4.优化:
3.4 剪切和粘贴的操作应该是可撤销的
3.5 被粘贴的项目在被粘贴时成为选中的; 不选择任何现有的选择
方法:
3.4 就是将剪切时的删除动作和粘贴时的新增操作注册到撤销栈中
3.5 就是将粘贴时新创建的对象选中即可
代码:
BlobController.java
public void handleCut() {
iModel.getBlobClipboard().addToClipboard(iModel.getSelected());
model.deleteBlobs(iModel.getSelected());
// 将剪切时的删除动作注册到撤销栈中
iModel.registerUndoStack(new BlobAction(iModel.getSelected(),"DELETE"));
}
public void handleCopy(){
iModel.getBlobClipboard().addToClipboard(iModel.getSelected());
}
public void handlePaste(){
Blob blob = iModel.getBlobClipboard().copy();
Blob addBlob = model.addBlob(blob.getX(), blob.getY(), blob.getR());
// 将粘贴时的新增操作注册到撤销栈中
iModel.registerUndoStack(new BlobAction(addBlob,"CREATE"));
// 就是将粘贴时新创建的对象选中即可
iModel.setSelected(addBlob);
}
到此为止,第三部分的需求完成。
本文详细描述了一个Java项目中实现剪切板功能的过程,包括需求分析(如控制键操作、撤销/重做机制)、Clipboard类的创建、在InteractionModel中整合剪贴板、快捷键设置以及对剪切/复制/粘贴操作的可逆性和选择行为的优化。
971





