完善设置页面

This commit is contained in:
许轲 2023-09-04 02:01:21 +08:00
parent 97c4863a32
commit 3da865f292
2 changed files with 176 additions and 56 deletions

View File

@ -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());
}
}
}

View File

@ -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;
/**
* 设置窗口管理类实现了单例模式
*
* <p>该类用于管理设置窗口的显示和内容</p>
*
* @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("设置窗口");
// 创建 TreeView并初始化设置项
TreeView<String> settingsTreeView = createTreeView();
// 创建一个分割面板左侧是设置树右侧是内容显示区域
SplitPane splitPane = new SplitPane(settingsTreeView, contentDisplay);
// 设置分割位置
contentDisplay = new StackPane();
TreeView<String> treeView = createTreeView();
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<String> createTreeView() {
TreeItem<String> rootItem = new TreeItem<>("设置");
rootItem.setExpanded(true);
TreeItem<String> root = new TreeItem<>("root");
root.setExpanded(true);
//常规设置树
TreeItem<String> generalItem = new TreeItem<>("常规设置");
TreeItem<String> generalItem1 = new TreeItem<>("常规设置项1");
TreeItem<String> generalItem2 = new TreeItem<>("常规设置项2");
generalItem.getChildren().add(generalItem1);
generalItem.getChildren().add(generalItem2);
//外观设置树
TreeItem<String> appearanceItem = new TreeItem<>("外观设置");
TreeItem<String> appearanceItem1 = new TreeItem<>("外观设置项1");
TreeItem<String> appearanceItem2 = new TreeItem<>("外观设置项2");
appearanceItem.getChildren().add(appearanceItem1);
appearanceItem.getChildren().add(appearanceItem2);
//安全设置树
TreeItem<String> securityItem = new TreeItem<>("安全设置");
generalItem.getChildren().add(new TreeItem<>("常规设置项1"));
generalItem.getChildren().add(new TreeItem<>("常规设置项2"));
TreeItem<String> securityItem1 = new TreeItem<>("安全设置项1");
TreeItem<String> securityItem2 = new TreeItem<>("安全设置项2");
securityItem.getChildren().add(securityItem1);
securityItem.getChildren().add(securityItem2);
appearanceItem.getChildren().add(new TreeItem<>("外观设置项1"));
appearanceItem.getChildren().add(new TreeItem<>("外观设置项2"));
root.getChildren().add(generalItem);
root.getChildren().add(appearanceItem);
root.getChildren().add(securityItem);
TreeView<String> treeView = new TreeView<>(root);
treeView.setShowRoot(false);
securityItem.getChildren().add(new TreeItem<>("安全设置项1"));
securityItem.getChildren().add(new TreeItem<>("安全设置项2"));
rootItem.getChildren().add(generalItem);
rootItem.getChildren().add(appearanceItem);
rootItem.getChildren().add(securityItem);
TreeView<String> 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;
}
}