From 4abe8b7a35ed6c66012fcf85ceabc45357ee4143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Fri, 1 Sep 2023 00:25:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E8=AE=BE=E7=BD=AE=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E4=BE=A7=E8=BE=B9=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcnc/jnotepad/root/RootBorderPane.java | 17 ++-- .../root/center/main/MainBorderPane.java | 8 +- .../root/center/main/top/MainTopVBox.java | 20 ----- .../left/sidebar/RootLeftSideBarVBox.java | 21 ----- .../sidebar}/tools/JNotepadToolBar.java | 2 +- .../top => left/sidebar}/tools/ToolHBox.java | 2 +- .../jnotepad/root/top/RootTopBorderPane.java | 26 ++++++ .../jnotepad/root/top/RootTopSideBarVBox.java | 20 ----- .../main => }/top/menu/JNotepadMenuBar.java | 4 +- .../java/org/jcnc/jnotepad/tool/UiUtil.java | 2 +- .../jnotepad/view/manager/CustomTitleBar.java | 82 ++++++++++++++++++ src/main/resources/icon.png | Bin 0 -> 381 bytes 12 files changed, 127 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/org/jcnc/jnotepad/root/center/main/top/MainTopVBox.java delete mode 100644 src/main/java/org/jcnc/jnotepad/root/left/sidebar/RootLeftSideBarVBox.java rename src/main/java/org/jcnc/jnotepad/root/{center/main/top => left/sidebar}/tools/JNotepadToolBar.java (94%) rename src/main/java/org/jcnc/jnotepad/root/{center/main/top => left/sidebar}/tools/ToolHBox.java (89%) create mode 100644 src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java delete mode 100644 src/main/java/org/jcnc/jnotepad/root/top/RootTopSideBarVBox.java rename src/main/java/org/jcnc/jnotepad/root/{center/main => }/top/menu/JNotepadMenuBar.java (98%) create mode 100644 src/main/java/org/jcnc/jnotepad/view/manager/CustomTitleBar.java create mode 100644 src/main/resources/icon.png diff --git a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java index 4be8100..ea06915 100644 --- a/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java +++ b/src/main/java/org/jcnc/jnotepad/root/RootBorderPane.java @@ -2,11 +2,14 @@ package org.jcnc.jnotepad.root; import org.jcnc.jnotepad.root.bottom.RootBottomSideBarVBox; import org.jcnc.jnotepad.root.center.main.MainBorderPane; -import org.jcnc.jnotepad.root.left.sidebar.RootLeftSideBarVBox; +import org.jcnc.jnotepad.root.left.sidebar.tools.ToolHBox; import org.jcnc.jnotepad.root.right.RootRightSideBarVBox; -import org.jcnc.jnotepad.root.top.RootTopSideBarVBox; +import org.jcnc.jnotepad.root.top.RootTopBorderPane; import org.jcnc.jnotepad.ui.module.AbstractBorderPane; +/* + * 根舞台下的Root主布局 + * */ public class RootBorderPane extends AbstractBorderPane { private static final RootBorderPane INSTANCE = new RootBorderPane(); @@ -16,11 +19,11 @@ public class RootBorderPane extends AbstractBorderPane { } private void initRootBorderPane() { - setCenterComponent(MainBorderPane.getInstance()); - setLeftComponent(RootLeftSideBarVBox.getInstance()); - setRightComponent(RootRightSideBarVBox.getInstance()); - setTopComponent(RootTopSideBarVBox.getInstance()); - setBottomComponent(RootBottomSideBarVBox.getInstance()); + setCenterComponent(MainBorderPane.getInstance()); //中间,用于显示Main主布局 + setLeftComponent(ToolHBox.getInstance()); //主布局的左边 + setRightComponent(RootRightSideBarVBox.getInstance()); //主布局的右边 + setTopComponent(RootTopBorderPane.getInstance()); //主布局的上面 + setBottomComponent(RootBottomSideBarVBox.getInstance());//主布局的下面 } public static RootBorderPane getInstance() { diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java index d6a32ac..89fad59 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java +++ b/src/main/java/org/jcnc/jnotepad/root/center/main/MainBorderPane.java @@ -1,9 +1,11 @@ package org.jcnc.jnotepad.root.center.main; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane; -import org.jcnc.jnotepad.root.center.main.top.MainTopVBox; import org.jcnc.jnotepad.ui.module.AbstractBorderPane; +/* + * MainBorderPane区域,用于显示文本框以及文本框周边 + * */ public class MainBorderPane extends AbstractBorderPane { private static final MainBorderPane INSTANCE = new MainBorderPane(); @@ -13,11 +15,9 @@ public class MainBorderPane extends AbstractBorderPane { } private void initRootBorderPane() { - //setBottomComponent(JNotepadStatusBox.getInstance()); - setCenter(JNotepadTabPane.getInstance()); + setCenterComponent(JNotepadTabPane.getInstance()); //文本框 - setTopComponent(MainTopVBox.getInstance()); } public static MainBorderPane getInstance() { diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/top/MainTopVBox.java b/src/main/java/org/jcnc/jnotepad/root/center/main/top/MainTopVBox.java deleted file mode 100644 index 0238371..0000000 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/top/MainTopVBox.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.jcnc.jnotepad.root.center.main.top; - -import javafx.scene.layout.VBox; -import org.jcnc.jnotepad.root.center.main.top.menu.JNotepadMenuBar; -import org.jcnc.jnotepad.root.center.main.top.tools.ToolHBox; - -public class MainTopVBox extends VBox { - private static final MainTopVBox INSTANCE = new MainTopVBox(); - - private MainTopVBox() { - // 在构造函数中初始化 - getChildren().add(JNotepadMenuBar.getInstance()); - getChildren().add(ToolHBox.getInstance()); - } - - public static MainTopVBox getInstance() { - return INSTANCE; - } - -} diff --git a/src/main/java/org/jcnc/jnotepad/root/left/sidebar/RootLeftSideBarVBox.java b/src/main/java/org/jcnc/jnotepad/root/left/sidebar/RootLeftSideBarVBox.java deleted file mode 100644 index c9206ea..0000000 --- a/src/main/java/org/jcnc/jnotepad/root/left/sidebar/RootLeftSideBarVBox.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.jcnc.jnotepad.root.left.sidebar; - -import org.jcnc.jnotepad.ui.module.AbstractVBox; - -public class RootLeftSideBarVBox extends AbstractVBox { - - private static final RootLeftSideBarVBox INSTANCE = new RootLeftSideBarVBox(); - - private RootLeftSideBarVBox() { - initSidebarVBox(); - } - - private void initSidebarVBox() { - - } - - - public static RootLeftSideBarVBox getInstance() { - return INSTANCE; - } -} diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/JNotepadToolBar.java b/src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/JNotepadToolBar.java similarity index 94% rename from src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/JNotepadToolBar.java rename to src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/JNotepadToolBar.java index 1f63cab..0f75228 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/JNotepadToolBar.java +++ b/src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/JNotepadToolBar.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.root.center.main.top.tools; +package org.jcnc.jnotepad.root.left.sidebar.tools; import javafx.scene.control.Button; import javafx.scene.control.ToolBar; diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/ToolHBox.java b/src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/ToolHBox.java similarity index 89% rename from src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/ToolHBox.java rename to src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/ToolHBox.java index 364d959..b7a0992 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/top/tools/ToolHBox.java +++ b/src/main/java/org/jcnc/jnotepad/root/left/sidebar/tools/ToolHBox.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.root.center.main.top.tools; +package org.jcnc.jnotepad.root.left.sidebar.tools; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; diff --git a/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java b/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java new file mode 100644 index 0000000..09f0fae --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/root/top/RootTopBorderPane.java @@ -0,0 +1,26 @@ +package org.jcnc.jnotepad.root.top; + +import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar; +import org.jcnc.jnotepad.ui.module.AbstractBorderPane; + +/* + * MainBorderPane区域,用于显示文本框以及文本框周边 + * */ +public class RootTopBorderPane extends AbstractBorderPane { + + private static final RootTopBorderPane INSTANCE = new RootTopBorderPane(); + + private RootTopBorderPane() { + initRootBorderPane(); + } + + private void initRootBorderPane() { + setTopComponent(JNotepadMenuBar.getInstance()); //文本框上面 + } + + public static RootTopBorderPane getInstance() { + return INSTANCE; + } +} + + diff --git a/src/main/java/org/jcnc/jnotepad/root/top/RootTopSideBarVBox.java b/src/main/java/org/jcnc/jnotepad/root/top/RootTopSideBarVBox.java deleted file mode 100644 index fc9c90a..0000000 --- a/src/main/java/org/jcnc/jnotepad/root/top/RootTopSideBarVBox.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.jcnc.jnotepad.root.top; - -import org.jcnc.jnotepad.ui.module.AbstractVBox; - -public class RootTopSideBarVBox extends AbstractVBox { - - private static final RootTopSideBarVBox INSTANCE = new RootTopSideBarVBox(); - - private RootTopSideBarVBox() { - initSidebarVBox(); - } - - private void initSidebarVBox() { - - } - - public static RootTopSideBarVBox getInstance() { - return INSTANCE; - } -} diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/top/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java similarity index 98% rename from src/main/java/org/jcnc/jnotepad/root/center/main/top/menu/JNotepadMenuBar.java rename to src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java index 9b27637..5b8a5e9 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/top/menu/JNotepadMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/root/top/menu/JNotepadMenuBar.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.root.center.main.top.menu; +package org.jcnc.jnotepad.root.top.menu; import javafx.event.ActionEvent; import javafx.scene.control.*; @@ -12,7 +12,7 @@ import org.jcnc.jnotepad.controller.event.handler.tool.SetBtn; import org.jcnc.jnotepad.controller.i18n.LocalizationController; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane; -import org.jcnc.jnotepad.root.center.main.top.tools.JNotepadToolBar; +import org.jcnc.jnotepad.root.left.sidebar.tools.JNotepadToolBar; import org.jcnc.jnotepad.tool.LogUtil; import org.slf4j.Logger; diff --git a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java index fef4518..b114473 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java +++ b/src/main/java/org/jcnc/jnotepad/tool/UiUtil.java @@ -6,7 +6,7 @@ import org.jcnc.jnotepad.constants.AppConstants; import org.jcnc.jnotepad.root.center.main.bottom.status.JNotepadStatusBox; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTabPane; -import org.jcnc.jnotepad.root.center.main.top.menu.JNotepadMenuBar; +import org.jcnc.jnotepad.root.top.menu.JNotepadMenuBar; import org.jcnc.jnotepad.ui.setStage.SetStage; import org.jcnc.jnotepad.view.manager.ViewManager; diff --git a/src/main/java/org/jcnc/jnotepad/view/manager/CustomTitleBar.java b/src/main/java/org/jcnc/jnotepad/view/manager/CustomTitleBar.java new file mode 100644 index 0000000..e682b55 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/view/manager/CustomTitleBar.java @@ -0,0 +1,82 @@ +package org.jcnc.jnotepad.view.manager; + +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.stage.Stage; + +public class CustomTitleBar extends HBox { + private static CustomTitleBar instance; + + private CustomTitleBar() { + // 设置样式和布局 + this.setAlignment(Pos.CENTER); + + // 左侧图标 + ImageView iconView = new ImageView(new Image("icon.png")); + iconView.setFitWidth(30); + iconView.setFitHeight(30); + + Label titleLabel = new Label("自定义标题栏"); + titleLabel.setStyle("-fx-font-size: 18px;"); + + // 右侧按钮区域 + HBox buttonBox = new HBox(5); + buttonBox.setAlignment(Pos.CENTER_RIGHT); + + Button minimizeButton = new Button("-"); + minimizeButton.setStyle("-fx-background-color: transparent; "); + minimizeButton.setOnAction(event -> { + Stage stage = (Stage) this.getScene().getWindow(); + stage.setIconified(true); // 最小化窗口 + }); + + Button maximizeButton = new Button("□"); + maximizeButton.setStyle("-fx-background-color: transparent;"); + maximizeButton.setOnAction(event -> { + Stage stage = (Stage) this.getScene().getWindow(); + stage.setMaximized(!stage.isMaximized()); // 最大化/还原窗口 + }); + + Button closeButton = new Button("X"); + closeButton.setStyle("-fx-background-color: transparent;"); + closeButton.setOnAction(event -> { + Stage stage = (Stage) this.getScene().getWindow(); + stage.close(); + }); + + buttonBox.getChildren().addAll(minimizeButton, maximizeButton, closeButton); + + this.getChildren().addAll(iconView, titleLabel, buttonBox); + } + + public static CustomTitleBar getInstance() { + if (instance == null) { + instance = new CustomTitleBar(); + } + return instance; + } + + public void makeDraggable(Stage stage) { + final Delta dragDelta = new Delta(); + + // 当鼠标按下时记录初始偏移量 + this.setOnMousePressed(mouseEvent -> { + dragDelta.x = stage.getX() - mouseEvent.getScreenX(); + dragDelta.y = stage.getY() - mouseEvent.getScreenY(); + }); + + // 当鼠标拖动时,根据偏移量更新舞台的位置 + this.setOnMouseDragged(mouseEvent -> { + stage.setX(mouseEvent.getScreenX() + dragDelta.x); + stage.setY(mouseEvent.getScreenY() + dragDelta.y); + }); + } + + private static class Delta { + double x, y; + } +} diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e05738067e69c7b0e8f8628dcd3b1e33cc507098 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^&LGUe1|*N4+EEOoI14-?fi$-;2s1Lwnj^u$z^L!( z;uumf=k1-nUd)aXtq=F!%}Lg*P_JSRD>IAKIpWkJlNu<{%^}qhC2?@SnLCq~dQ)c8 z$y0muYf29tesf0UXqf2P>%qmBq`$;_&y6~J*W7LGvqfQ#gVNcU+71|KJKLzGofnW^ zVd=Z&+2XIy-rijNJ@0&4^$w|?mCN5%ML%~>s9|+ufxu%{2HV=-1}#3hSG@GAQRFXU zvvYj^j{leZ{rI6%&*S4CPwnHDU^={p=i`hSw$3>Vo|y=`uily7;XQq4