From 37bbfe74c9e4fb7d0d3dc3e8d30d731790370147 Mon Sep 17 00:00:00 2001 From: wenli Date: Sat, 3 Aug 2024 15:31:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0tabpane=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/lw/fx/view/main/MainView.java | 71 +++++++++++++++++- dump.rdb | Bin 0 -> 1104 bytes 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 dump.rdb diff --git a/dillon-ui/dillon-ui-fx/src/main/java/com/lw/fx/view/main/MainView.java b/dillon-ui/dillon-ui-fx/src/main/java/com/lw/fx/view/main/MainView.java index b5c961a..01e7447 100644 --- a/dillon-ui/dillon-ui-fx/src/main/java/com/lw/fx/view/main/MainView.java +++ b/dillon-ui/dillon-ui-fx/src/main/java/com/lw/fx/view/main/MainView.java @@ -38,7 +38,10 @@ import javafx.fxml.Initializable; import javafx.geometry.Bounds; import javafx.scene.Node; import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.control.*; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.*; import javafx.util.Duration; import org.kordamp.ikonli.Ikon; @@ -106,6 +109,18 @@ public class MainView implements FxmlView, Initializable { popover.setHeaderAlwaysVisible(false); popover.setArrowLocation(Popover.ArrowLocation.TOP_CENTER); tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); + // 添加右键菜单 + // 添加右键菜单 + ContextMenu contextMenu = createContextMenu(tabPane); + tabPane.setOnMouseClicked(event -> { + if (event.getButton() == MouseButton.SECONDARY && isOnTab(event)) { + contextMenu.show(tabPane, event.getScreenX(), event.getScreenY()); + } else { + contextMenu.hide(); + } + }); + + rootPane.getStyleClass().add("main-view"); sideMenu = new NavTree<>(); VBox.setVgrow(sideMenu, Priority.ALWAYS); @@ -201,7 +216,7 @@ public class MainView implements FxmlView, Initializable { fadeTransition.play(); ViewTuple viewTuple = FluentViewLoader.fxmlView(DashboardView.class).load(); -// loddTab("主页", Material2AL.HOME,true, viewTuple.getView()); + loddTab("主页", Material2AL.HOME,false, viewTuple.getView()); MvvmFX.getNotificationCenter().subscribe("showThemePage", (key, payload) -> { // trigger some actions Platform.runLater(() -> { @@ -219,6 +234,11 @@ public class MainView implements FxmlView, Initializable { tagLabel.textProperty().bindBidirectional(mainViewModel.unreadCountProperty()); } + private boolean isOnTab(MouseEvent event) { + // 检查点击是否在TabPane顶部的60像素范围内 + double mouseY = event.getY(); + return mouseY >= 0 && mouseY <= 60; + } private void createInfoCenterView() { slackGroup.setSortOrder(0); @@ -513,6 +533,55 @@ public class MainView implements FxmlView, Initializable { Platform.runLater(dialog::requestFocus); } + private ContextMenu createContextMenu(TabPane tabPane) { + ContextMenu contextMenu = new ContextMenu(); + + // 关闭当前标签 + MenuItem closeCurrent = new MenuItem("关闭当前"); + closeCurrent.setOnAction(e -> { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + if (selectedTab != null && selectedTab.isClosable()) { + tabPane.getTabs().remove(selectedTab); + } + }); + + // 关闭左侧标签 + MenuItem closeLeft = new MenuItem("关闭左侧"); + closeLeft.setOnAction(e -> { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + if (selectedTab != null) { + int selectedIndex = tabPane.getTabs().indexOf(selectedTab); + tabPane.getTabs().removeIf(tab -> tabPane.getTabs().indexOf(tab) < selectedIndex && tab.isClosable()); + } + }); + + // 关闭右侧标签 + MenuItem closeRight = new MenuItem("关闭右侧"); + closeRight.setOnAction(e -> { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + if (selectedTab != null) { + int selectedIndex = tabPane.getTabs().indexOf(selectedTab); + tabPane.getTabs().removeIf(tab -> tabPane.getTabs().indexOf(tab) > selectedIndex && tab.isClosable()); + } + }); + + // 关闭其它标签 + MenuItem closeOthers = new MenuItem("关闭其它"); + closeOthers.setOnAction(e -> { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + if (selectedTab != null) { + tabPane.getTabs().removeIf(tab -> tab != selectedTab && tab.isClosable()); + } + }); + + // 关闭所有标签 + MenuItem closeAll = new MenuItem("关闭所有"); + closeAll.setOnAction(e -> tabPane.getTabs().removeIf(Tab::isClosable)); + + contextMenu.getItems().addAll(closeCurrent, closeLeft, closeRight, closeOthers, closeAll); + return contextMenu; + } + public static class CalendarNotification extends Notification { diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..7ecf04369c91bfd8f9d517707bfcb6cf2d6da8b7 GIT binary patch literal 1104 zcmY+CO>7%Q7>3vD*raKGDEXn{&*K4l+H5@I^?Ge2WH$xm3aKhhdkG<)-I;ABS??^n zvvJcXl5;@_BuYRakT}2vgb)J62`*U886hOdplE2#*FiR_5!bM) zF2U(BOlsOTadEA*-5hUTo?3@a$cSWfX)3JyvFB+p4rr1;)qXr9!XyV0Wi(Hj$0Vcu zNAr^T#Fwo^8B;hoQLs#GXz(z1Za)^*;qlJTkR1(khK&dp2bS-c=B|*qiB(+<(Li)?MO7OoJQ@rFXc!skFc_ zC?0iD%R~&c6bT+^|DYmV2IHBu$@hoh?blxabMx)pZ{Pgm!%Z-m^~6;HCJRea2KAX4 z$s(z*#gqu03rA2E>W)8?GAv+*4Wn#YR@EY9)3htdv`Q6X5MsMX4}9e+I6p*L{Pj z;|>RJ^lxPrW#e9ZMNREWCKobsRD1=#*m$XZa-bV>$=XkW&Y)-pK`2()rDQ6lxRa4Q znfSi#BqO5uPEN$3!&=SHejR(c%@tbQfrIxEZ{PB;Lq_3bc6|eG{QLFOpWIpYuYB|$ Ddqi!o literal 0 HcmV?d00001