From 3da865f29236ac6fb1674a606c4843c25358eb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Mon, 4 Sep 2023 02:01:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=AE=BE=E7=BD=AE=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/bottom/status/BottomStatusBox.java | 7 +- .../jcnc/jnotepad/ui/setstage/SetStage.java | 223 ++++++++++++++---- 2 files changed, 175 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/bottom/status/BottomStatusBox.java b/src/main/java/org/jcnc/jnotepad/root/center/main/bottom/status/BottomStatusBox.java index 05d608d..ebd603b 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/bottom/status/BottomStatusBox.java +++ b/src/main/java/org/jcnc/jnotepad/root/center/main/bottom/status/BottomStatusBox.java @@ -45,6 +45,7 @@ public class BottomStatusBox extends AbstractHorizontalBox { * 初始化状态栏组件 */ public void initStatusBox() { + this.setStyle("-fx-background-color: rgba(43,43,43,0.12);"); this.getChildren().clear(); // 创建状态栏 @@ -110,9 +111,9 @@ public class BottomStatusBox extends AbstractHorizontalBox { CenterTabPane instance = CenterTabPane.getInstance(); if (instance.getSelected() != null) { updateWordCountStatusLabel(); - CenterTab CenterTab = instance.getSelected(); - if (CenterTab != null) { - updateEncodingLabel(CenterTab.getCharset().name()); + CenterTab centerTab = instance.getSelected(); + if (centerTab != null) { + updateEncodingLabel(centerTab.getCharset().name()); } } } diff --git a/src/main/java/org/jcnc/jnotepad/ui/setstage/SetStage.java b/src/main/java/org/jcnc/jnotepad/ui/setstage/SetStage.java index adab40d..3524a01 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/setstage/SetStage.java +++ b/src/main/java/org/jcnc/jnotepad/ui/setstage/SetStage.java @@ -1,102 +1,221 @@ package org.jcnc.jnotepad.ui.setstage; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.control.SplitPane; -import javafx.scene.control.TreeItem; -import javafx.scene.control.TreeView; +import javafx.scene.control.*; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; import javafx.stage.Stage; -import org.jcnc.jnotepad.tool.UiUtil; /** - * 设置窗口管理类,实现了单例模式。 - * - *

该类用于管理设置窗口的显示和内容。

- * - * @author 许轲 + * SetStage类表示设置窗口的单例对象。此窗口用于显示不同的设置选项和其对应的布局。 + * 通过调用getInstance方法获取SetStage的实例,并使用openSetStage方法打开设置窗口。 */ -public class SetStage { +public class SetStage extends Stage { - /** - * 唯一的 SetStage 实例,使用单例模式 - */ - private static final SetStage SET_STAGE = new SetStage(); + private static SetStage instance; private StackPane contentDisplay; + /** + * 私有构造方法以实现单例模式。 + */ private SetStage() { - // 私有构造方法以实现单例模式 } /** - * 获取 SetStage 的唯一实例。 + * 获取SetStage的唯一实例。 * - * @return SetStage 的实例 + * @return SetStage的实例 */ public static SetStage getInstance() { - return SET_STAGE; + if (instance == null) { + instance = new SetStage(); + } + return instance; } /** - * 打开设置窗口。 + * 打开设置窗口,显示不同的设置选项和对应的布局。 */ public void openSetStage() { - // 创建一个用于显示内容的 StackPane,并初始化为默认显示的标签 - contentDisplay = new StackPane(new Label("从左侧选择设置以显示内容")); + Stage primaryStage = new Stage(); + primaryStage.setTitle("设置窗口"); + + + + contentDisplay = new StackPane(); - // 创建 TreeView,并初始化设置项 - TreeView settingsTreeView = createTreeView(); + TreeView treeView = createTreeView(); - // 创建一个分割面板,左侧是设置树,右侧是内容显示区域 - SplitPane splitPane = new SplitPane(settingsTreeView, contentDisplay); - // 设置分割位置 + SplitPane splitPane = new SplitPane(treeView, contentDisplay); splitPane.setDividerPositions(0.3); - // 创建设置窗口的场景 - Scene scene = new Scene(splitPane, 800, 600); + HBox bottomBox= new HBox(10); + bottomBox.setAlignment(Pos.CENTER_RIGHT); + bottomBox.setStyle("-fx-background-color: rgba(43,43,43,0.12);"); + bottomBox.setPadding(new Insets(10,10,10,10)); + Button confirmButton=new Button(" 确认 "); + Button cancelButton =new Button(" 取消 "); + Button applicationButton =new Button(" 应用 "); + bottomBox.getChildren().addAll(confirmButton,cancelButton,applicationButton); - // 创建设置窗口的 Stage,并设置标题和场景 - Stage setStage = new Stage(); - setStage.setScene(scene); - setStage.setTitle("设置窗口"); - setStage.getIcons().add(UiUtil.getAppIcon()); - setStage.show(); + + BorderPane root = new BorderPane(); + root.setCenter(splitPane); + root.setBottom(bottomBox); + + Scene scene = new Scene(root, 800, 600); + + primaryStage.setScene(scene); + primaryStage.show(); } /** - * 创建一个 TreeView 并初始化项。 + * 创建TreeView控件并设置其根节点,包括设置项的层次结构。 * - * @return 初始化后的 TreeView + * @return 创建的TreeView对象 */ private TreeView createTreeView() { - TreeItem rootItem = new TreeItem<>("设置"); - rootItem.setExpanded(true); + TreeItem root = new TreeItem<>("root"); + root.setExpanded(true); + //常规设置树 TreeItem generalItem = new TreeItem<>("常规设置"); + + TreeItem generalItem1 = new TreeItem<>("常规设置项1"); + TreeItem generalItem2 = new TreeItem<>("常规设置项2"); + generalItem.getChildren().add(generalItem1); + generalItem.getChildren().add(generalItem2); + + + //外观设置树 TreeItem appearanceItem = new TreeItem<>("外观设置"); - TreeItem securityItem = new TreeItem<>("安全设置"); - generalItem.getChildren().add(new TreeItem<>("常规设置项1")); - generalItem.getChildren().add(new TreeItem<>("常规设置项2")); + TreeItem appearanceItem1 = new TreeItem<>("外观设置项1"); + TreeItem appearanceItem2 = new TreeItem<>("外观设置项2"); + appearanceItem.getChildren().add(appearanceItem1); + appearanceItem.getChildren().add(appearanceItem2); - appearanceItem.getChildren().add(new TreeItem<>("外观设置项1")); - appearanceItem.getChildren().add(new TreeItem<>("外观设置项2")); + //安全设置树 + TreeItem securityItem = new TreeItem<>("安全设置"); - securityItem.getChildren().add(new TreeItem<>("安全设置项1")); - securityItem.getChildren().add(new TreeItem<>("安全设置项2")); + TreeItem securityItem1 = new TreeItem<>("安全设置项1"); + TreeItem securityItem2 = new TreeItem<>("安全设置项2"); + securityItem.getChildren().add(securityItem1); + securityItem.getChildren().add(securityItem2); - rootItem.getChildren().add(generalItem); - rootItem.getChildren().add(appearanceItem); - rootItem.getChildren().add(securityItem); + root.getChildren().add(generalItem); + root.getChildren().add(appearanceItem); + root.getChildren().add(securityItem); + TreeView treeView = new TreeView<>(root); + treeView.setShowRoot(false); - TreeView treeView = new TreeView<>(rootItem); treeView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { if (newValue != null) { - // 更新内容显示区域为选定项的设置内容标签 - contentDisplay.getChildren().setAll(new Label(newValue.getValue() + " 的设置内容")); + String selectedItem = newValue.getValue(); + Node selectedLayout = createLayoutForSelectedItem(selectedItem); + contentDisplay.getChildren().setAll(selectedLayout); } }); return treeView; } + private Node createLayoutForSelectedItem(String selectedItem) { + return switch (selectedItem) { + case "常规设置项1" -> createGeneralSettingsLayout1(); + case "常规设置项2" -> createGeneralSettingsLayout2(); + case "外观设置项1" -> createAppearanceSettingsLayout1(); + case "外观设置项2" -> createAppearanceSettingsLayout2(); + case "安全设置项1" -> createSecuritySettingsLayout1(); + case "安全设置项2" -> createSecuritySettingsLayout2(); + default -> null; + }; + } + + /** + * 创建常规设置项1的布局。 + * + * @return 常规设置项1的布局节点 + */ + private Node createGeneralSettingsLayout1() { + VBox generalLayout = new VBox(); + + // 添加一个Label作为设置项的标题 + Label titleLabel = new Label("常规设置项1"); + + // 添加一个TextField用于输入 + TextField textField = new TextField(); + textField.setPromptText("输入设置项1的值"); + + // 添加一个CheckBox用于开关 + CheckBox checkBox = new CheckBox("启用设置项1"); + + // 添加一个Button用于保存设置 + Button saveButton = new Button("保存设置"); + + // 将所有节点添加到VBox布局中 + generalLayout.getChildren().addAll(titleLabel, textField, checkBox, saveButton); + + return generalLayout; + } + + + /** + * 创建常规设置项2的布局。 + * + * @return 常规设置项2的布局节点 + */ + private Node createGeneralSettingsLayout2() { + VBox generalLayout = new VBox(); + generalLayout.getChildren().add(new Label("常规设置项2的布局")); + return generalLayout; + } + + /** + * 创建外观设置项1的布局。 + * + * @return 外观设置项1的布局节点 + */ + private Node createAppearanceSettingsLayout1() { + VBox appearanceLayout = new VBox(); + appearanceLayout.getChildren().add(new Label("外观设置项1的布局")); + return appearanceLayout; + } + + /** + * 创建外观设置项2的布局。 + * + * @return 外观设置项2的布局节点 + */ + private Node createAppearanceSettingsLayout2() { + VBox appearanceLayout = new VBox(); + appearanceLayout.getChildren().add(new Label("外观设置项2的布局")); + return appearanceLayout; + } + + /** + * 创建安全设置项1的布局。 + * + * @return 安全设置项1的布局节点 + */ + private Node createSecuritySettingsLayout1() { + VBox securityLayout = new VBox(); + securityLayout.getChildren().add(new Label("安全设置项1的布局")); + return securityLayout; + } + + /** + * 创建安全设置项2的布局。 + * + * @return 安全设置项2的布局节点 + */ + private Node createSecuritySettingsLayout2() { + VBox securityLayout = new VBox(); + securityLayout.getChildren().add(new Label("安全设置项2的布局")); + return securityLayout; + } } -- Gitee