From 9cdf93a913e57498ff29bf18d3137719ff9cdaa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Sat, 9 Sep 2023 00:17:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=90=8C=E6=A0=B7=E7=9A=84=E6=96=87=E4=BB=B6=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=8F=90=E7=A4=BA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/handler/menubar/RenameFile.java | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/RenameFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/RenameFile.java index 74dbd91..bcc9c8e 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/RenameFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/RenameFile.java @@ -10,6 +10,7 @@ import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.root.center.main.center.tab.CenterTab; import org.jcnc.jnotepad.root.center.main.center.tab.CenterTabPane; import org.jcnc.jnotepad.tool.LogUtil; +import org.jcnc.jnotepad.tool.PopUpUtil; import org.jcnc.jnotepad.tool.UiUtil; import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicFileChooserFactory; import org.slf4j.Logger; @@ -53,28 +54,42 @@ public class RenameFile implements EventHandler { private void handleRenameTab(CenterTab centerTab) { TextField textField = new TextField(centerTab.getText()); textField.getStyleClass().add("tab-title-editable"); + // 清空标签页名称 centerTab.setText(""); + // 监听 Enter 键,完成编辑 textField.setOnKeyPressed(event -> { if (event.getCode() == KeyCode.ENTER) { - centerTab.setText(textField.getText()); - // 可选:移除 TextField 的图形 - centerTab.setGraphic(null); - // 可选:恢复标签页的关闭按钮 - centerTab.setClosable(true); + String newTabName = textField.getText(); + + // 检查是否存在相同名称的标签页 + if (isTabNameExists(newTabName)) { + // 显示弹窗并提示用户更换名称 + showDuplicateNameAlert(newTabName); + } else { + centerTab.setText(newTabName); + // 可选:移除 TextField 的图形 + centerTab.setGraphic(null); + // 可选:恢复标签页的关闭按钮 + centerTab.setClosable(true); + } } }); + // 监听失去焦点事件,完成编辑 textField.focusedProperty().addListener((observable, oldValue, newValue) -> { if (Boolean.FALSE.equals(newValue)) { - centerTab.setText(textField.getText()); + String newTabName = textField.getText(); + centerTab.setText(newTabName); // 可选:移除 TextField 的图形 centerTab.setGraphic(null); // 可选:恢复标签页的关闭按钮 centerTab.setClosable(true); + } }); + centerTab.setClosable(false); // 设置 TextField 作为标签页的图形 centerTab.setGraphic(textField); @@ -83,6 +98,27 @@ public class RenameFile implements EventHandler { textField.selectAll(); } + /** + * 判断是否存在具有相同名称的标签页。 + * + * @param newTabName 要检查的新标签页名称 + * @return 如果存在具有相同名称的标签页,则返回 true;否则返回 false + */ + private boolean isTabNameExists(String newTabName) { + CenterTabPane tabPane = CenterTabPane.getInstance(); + return tabPane.getTabs().stream() + .anyMatch(tab -> tab.getText().equals(newTabName)); + } + + /** + * 显示警告弹窗,提示用户更换重复的名称。 + */ + private void showDuplicateNameAlert(String newTabName) { + + PopUpUtil.errorAlert("重命名错误", "\" " + newTabName + "\" 和已有标签页名字重复", "请再次重命名", null, null); + + } + /** * 重命名关联文件。 * -- Gitee