From 425c4ce6bd04b6dc8915c76d8bb66448b6469c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Sun, 17 Sep 2023 23:30:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BB=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/module-info.java | 4 +- .../event/handler/menubar/NewFile.java | 2 +- .../ui/module/LineNumberTextArea.java | 2 +- .../ui/module/TerminalEmulatorComponent.java | 75 ++++++++++++++++++ .../bottom/RootBottomSideBarVerticalBox.java | 28 +++++-- .../views/root/bottom/cmd/CmdStatusBox.java | 78 +++++++++++++++++++ .../bottom/status/BottomStatusBox.java | 5 +- .../center/main/center/tab/CenterTabPane.java | 2 +- .../views/root/top/menu/TopMenuBar.java | 2 + 9 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java create mode 100644 src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java rename src/main/java/org/jcnc/jnotepad/views/root/{center/main => }/bottom/status/BottomStatusBox.java (98%) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index ca143d2..232b63d 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -30,10 +30,12 @@ module org.jcnc.jnotepad { exports org.jcnc.jnotepad.util; exports org.jcnc.jnotepad.common.interfaces; opens org.jcnc.jnotepad.app.config; - exports org.jcnc.jnotepad.views.root.center.main.bottom.status; exports org.jcnc.jnotepad.plugin.interfaces; exports org.jcnc.jnotepad.ui.dialog; exports org.jcnc.jnotepad.ui.dialog.interfaces; exports org.jcnc.jnotepad.model.entity; + exports org.jcnc.jnotepad.views.root.bottom; + exports org.jcnc.jnotepad.views.root.bottom.status; + exports org.jcnc.jnotepad.views.root.bottom.cmd; } \ No newline at end of file diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/NewFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/NewFile.java index 91214b8..548f2b9 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/NewFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/NewFile.java @@ -7,7 +7,7 @@ import org.jcnc.jnotepad.app.i18n.UiResourceBundle; import org.jcnc.jnotepad.common.constants.AppConstants; import org.jcnc.jnotepad.common.constants.TextConstants; import org.jcnc.jnotepad.ui.module.LineNumberTextArea; -import org.jcnc.jnotepad.views.root.center.main.bottom.status.BottomStatusBox; +import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane; diff --git a/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java b/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java index 64b570c..e13cc1d 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java +++ b/src/main/java/org/jcnc/jnotepad/ui/module/LineNumberTextArea.java @@ -4,7 +4,7 @@ import javafx.geometry.Insets; import org.fxmisc.richtext.LineNumberFactory; import org.fxmisc.richtext.StyleClassedTextArea; import org.jcnc.jnotepad.util.LogUtil; -import org.jcnc.jnotepad.views.root.center.main.bottom.status.BottomStatusBox; +import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane; import org.slf4j.Logger; diff --git a/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java new file mode 100644 index 0000000..e18094c --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java @@ -0,0 +1,75 @@ +package org.jcnc.jnotepad.ui.module; + +import javafx.application.Platform; +import javafx.geometry.Pos; +import javafx.scene.control.TextField; +import javafx.scene.input.KeyCode; +import javafx.scene.layout.VBox; +import org.fxmisc.richtext.CodeArea; +import org.fxmisc.richtext.LineNumberFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class TerminalEmulatorComponent extends VBox { + + private CodeArea terminalOutput; + private Process process; + + public TerminalEmulatorComponent() { + initializeUI(); + } + + private void initializeUI() { + terminalOutput = new CodeArea(); + TextField commandInput = new TextField(); + + // 设置行号 + terminalOutput.setParagraphGraphicFactory(LineNumberFactory.get(terminalOutput)); + + commandInput.setOnKeyPressed(event -> { + if (event.getCode() == KeyCode.ENTER) { + String command = commandInput.getText(); + executeCommand(command); + commandInput.clear(); + } + }); + + getChildren().addAll(terminalOutput, commandInput); + setAlignment(Pos.CENTER); + + // 设置布局样式和大小 + setSpacing(10); + setMinSize(800, 600); + } + + private void executeCommand(String command) { + try { + ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); + processBuilder.redirectErrorStream(true); + process = processBuilder.start(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); + String line; + while ((line = reader.readLine()) != null) { + appendToTerminalOutput(line + "\n"); + } + + int exitCode = process.waitFor(); + appendToTerminalOutput("Exit Code: " + exitCode + "\n"); + + } catch (IOException | InterruptedException e) { + appendToTerminalOutput("Error: " + e.getMessage() + "\n"); + } + } + + private void appendToTerminalOutput(String text) { + Platform.runLater(() -> { + terminalOutput.appendText(text); + // 将滚动条滚动到最后一行 + terminalOutput.moveTo(terminalOutput.getLength()); + terminalOutput.requestFollowCaret(); + }); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java index 0e649d6..f238555 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java @@ -1,7 +1,12 @@ package org.jcnc.jnotepad.views.root.bottom; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; import org.jcnc.jnotepad.ui.module.AbstractVerticalBox; -import org.jcnc.jnotepad.views.root.center.main.bottom.status.BottomStatusBox; +import org.jcnc.jnotepad.views.root.bottom.cmd.CmdStatusBox; +import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; +import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar; /** * 底部根侧边栏垂直布局 @@ -12,12 +17,6 @@ import org.jcnc.jnotepad.views.root.center.main.bottom.status.BottomStatusBox; */ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { - private static final RootBottomSideBarVerticalBox INSTANCE = new RootBottomSideBarVerticalBox(); - - private RootBottomSideBarVerticalBox() { - initSidebarVerticalBox(); - } - /** * 获取 RootBottomSideBarVerticalBox 的唯一实例。 * @@ -28,6 +27,19 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { } private void initSidebarVerticalBox() { - getChildren().addAll(BottomStatusBox.getInstance()); + VBox bottomSideBarVerticalBox = new VBox(); + + bottomSideBarVerticalBox.getChildren().addAll(CmdStatusBox.getInstance(), BottomStatusBox.getInstance()); + + + getChildren().addAll(bottomSideBarVerticalBox); + } + + private static final RootBottomSideBarVerticalBox INSTANCE = new RootBottomSideBarVerticalBox(); + + private RootBottomSideBarVerticalBox() { + initSidebarVerticalBox(); + } + } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java new file mode 100644 index 0000000..01df016 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java @@ -0,0 +1,78 @@ +package org.jcnc.jnotepad.views.root.bottom.cmd; + +import javafx.application.Platform; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuBar; +import javafx.scene.control.TextArea; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.text.Text; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.jcnc.jnotepad.controller.event.handler.menubar.SaveAsFile; +import org.jcnc.jnotepad.util.LogUtil; + +/** + * @author luke + */ +public class CmdStatusBox extends HBox { + + private static final CmdStatusBox CMD_STATUS_BOX = new CmdStatusBox(); + + private CmdStatusBox() { + initStatusBox(); + } + + public static CmdStatusBox getInstance() { + return CMD_STATUS_BOX; + } + + /** + * 初始化底部CMD按钮组件 + */ + public void initStatusBox() { + + + var menuBar = new MenuBar(); + HBox.setHgrow(menuBar, Priority.ALWAYS); + menuBar.setPadding(new Insets(-3, 0, -3, 35)); + + // 创建菜单项 1 + var runMenu = new Menu(); + var cmdMenu = new Menu(); + var buildMenu = new Menu(); + + // 创建菜单项 2 + var runLabel = new Label("运行"); + var cmdLabel = new Label("终端"); + var buildLabel = new Label("构建"); + + // 创建菜单点击事件 2 + runMenu.setGraphic(runLabel); + cmdMenu.setGraphic(cmdLabel); + buildMenu.setGraphic(buildLabel); + + cmdLabel.setOnMouseClicked(mouseEvent -> { + showTerminal(); + LogUtil.getLogger(this.getClass()).info("打开终端成功!"); + }); + + // 将一级菜单添加到菜单栏 + menuBar.getMenus().addAll(runMenu, cmdMenu, buildMenu); + + // 将菜单栏添加到CmdStatusBox + this.getChildren().add(menuBar); + + + } + + /** + * 在菜单上方创建一个终端 + */ + private void showTerminal() { + + } +} diff --git a/src/main/java/org/jcnc/jnotepad/views/root/center/main/bottom/status/BottomStatusBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/status/BottomStatusBox.java similarity index 98% rename from src/main/java/org/jcnc/jnotepad/views/root/center/main/bottom/status/BottomStatusBox.java rename to src/main/java/org/jcnc/jnotepad/views/root/bottom/status/BottomStatusBox.java index 4cf2baa..8675bb3 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/center/main/bottom/status/BottomStatusBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/status/BottomStatusBox.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.views.root.center.main.bottom.status; +package org.jcnc.jnotepad.views.root.bottom.status; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -131,8 +131,9 @@ public class BottomStatusBox extends AbstractHorizontalBox { /** * 更新行列信息 + * * @param caretPosition 光标位置 - * @param text 文本内容 + * @param text 文本内容 */ private void updateRowColumnLabel(int caretPosition, String text) { int row = getRow(caretPosition, text); diff --git a/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTabPane.java b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTabPane.java index d934939..28cfd1b 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTabPane.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTabPane.java @@ -2,7 +2,7 @@ package org.jcnc.jnotepad.views.root.center.main.center.tab; import javafx.scene.control.TabPane; import org.jcnc.jnotepad.controller.config.AppConfigController; -import org.jcnc.jnotepad.views.root.center.main.bottom.status.BottomStatusBox; +import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; import org.jcnc.jnotepad.views.root.top.menu.TopMenuBar; /** diff --git a/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java b/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java index b581e4d..a826e91 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java @@ -1,6 +1,7 @@ package org.jcnc.jnotepad.views.root.top.menu; import javafx.event.ActionEvent; +import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.input.KeyCombination; import javafx.stage.Stage; @@ -141,6 +142,7 @@ public class TopMenuBar extends MenuBar { * 初始化菜单栏 */ public void initMenuBar() { + setPadding(new Insets(-3,0,-3,0)); initFileMenu(); initLanguageMenu(); initSettingMenu(); From e561439b4d519095fb8465a9f66e4021e48ffd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Sun, 17 Sep 2023 23:59:41 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BB=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/module/TerminalEmulatorComponent.java | 8 ++-- .../bottom/RootBottomSideBarVerticalBox.java | 26 +++++++--- .../views/root/bottom/cmd/CmdStatusBox.java | 47 +++++++++---------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java index e18094c..42ba5c1 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java +++ b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java @@ -12,16 +12,19 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +/** + * @author luke + */ public class TerminalEmulatorComponent extends VBox { private CodeArea terminalOutput; private Process process; public TerminalEmulatorComponent() { - initializeUI(); + init(); } - private void initializeUI() { + private void init() { terminalOutput = new CodeArea(); TextField commandInput = new TextField(); @@ -41,7 +44,6 @@ public class TerminalEmulatorComponent extends VBox { // 设置布局样式和大小 setSpacing(10); - setMinSize(800, 600); } private void executeCommand(String command) { diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java index f238555..baf134e 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java @@ -1,12 +1,10 @@ package org.jcnc.jnotepad.views.root.bottom; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import org.jcnc.jnotepad.ui.module.AbstractVerticalBox; +import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent; import org.jcnc.jnotepad.views.root.bottom.cmd.CmdStatusBox; import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; -import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar; /** * 底部根侧边栏垂直布局 @@ -17,6 +15,8 @@ import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar; */ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { + VBox bottomSideBarVerticalBox; + /** * 获取 RootBottomSideBarVerticalBox 的唯一实例。 * @@ -26,10 +26,13 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { return INSTANCE; } - private void initSidebarVerticalBox() { - VBox bottomSideBarVerticalBox = new VBox(); + public void initSidebarVerticalBox() { + bottomSideBarVerticalBox = new VBox(); - bottomSideBarVerticalBox.getChildren().addAll(CmdStatusBox.getInstance(), BottomStatusBox.getInstance()); + TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); + + + bottomSideBarVerticalBox.getChildren().addAll(terminal,CmdStatusBox.getInstance(), BottomStatusBox.getInstance()); getChildren().addAll(bottomSideBarVerticalBox); @@ -38,8 +41,17 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { private static final RootBottomSideBarVerticalBox INSTANCE = new RootBottomSideBarVerticalBox(); - private RootBottomSideBarVerticalBox() { + public RootBottomSideBarVerticalBox() { initSidebarVerticalBox(); } + /** + * 获取 bottomSideBarVerticalBox 实例。 + * + * @return bottomSideBarVerticalBox 的实例 + */ + public VBox getBottomSideBarVerticalBox() { + return bottomSideBarVerticalBox; + } + } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java index 01df016..30474a4 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java @@ -1,19 +1,12 @@ package org.jcnc.jnotepad.views.root.bottom.cmd; -import javafx.application.Platform; import javafx.geometry.Insets; -import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; -import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; -import javafx.scene.text.Text; -import javafx.stage.Modality; -import javafx.stage.Stage; -import org.jcnc.jnotepad.controller.event.handler.menubar.SaveAsFile; -import org.jcnc.jnotepad.util.LogUtil; +import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent; /** * @author luke @@ -22,6 +15,11 @@ public class CmdStatusBox extends HBox { private static final CmdStatusBox CMD_STATUS_BOX = new CmdStatusBox(); + /** + * 用于跟踪终端的显示状态 + */ + private boolean terminalVisible = false; + private CmdStatusBox() { initStatusBox(); } @@ -30,49 +28,46 @@ public class CmdStatusBox extends HBox { return CMD_STATUS_BOX; } - /** - * 初始化底部CMD按钮组件 - */ public void initStatusBox() { - - var menuBar = new MenuBar(); HBox.setHgrow(menuBar, Priority.ALWAYS); menuBar.setPadding(new Insets(-3, 0, -3, 35)); - // 创建菜单项 1 var runMenu = new Menu(); var cmdMenu = new Menu(); var buildMenu = new Menu(); - // 创建菜单项 2 var runLabel = new Label("运行"); var cmdLabel = new Label("终端"); var buildLabel = new Label("构建"); - // 创建菜单点击事件 2 runMenu.setGraphic(runLabel); cmdMenu.setGraphic(cmdLabel); buildMenu.setGraphic(buildLabel); cmdLabel.setOnMouseClicked(mouseEvent -> { - showTerminal(); - LogUtil.getLogger(this.getClass()).info("打开终端成功!"); + toggleTerminal(); // 切换终端的显示/隐藏状态 }); - // 将一级菜单添加到菜单栏 menuBar.getMenus().addAll(runMenu, cmdMenu, buildMenu); - - // 将菜单栏添加到CmdStatusBox this.getChildren().add(menuBar); - - } - /** - * 在菜单上方创建一个终端 - */ + private void toggleTerminal() { + if (terminalVisible) { + // 隐藏终端 + terminalVisible = false; + // 在这里添加隐藏终端的代码 + } else { + // 显示终端 + terminalVisible = true; + showTerminal(); // 显示终端 + } + } + private void showTerminal() { + TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); + // 在这里添加显示终端的代码 } } From 2965a9283db0682071eef455128855e12fde304b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Mon, 18 Sep 2023 00:22:15 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E7=BB=88=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/module/TerminalEmulatorComponent.java | 23 ++++---- .../bottom/RootBottomSideBarVerticalBox.java | 15 +---- .../views/root/bottom/cmd/CmdStatusBox.java | 55 +++++++++++++++++-- 3 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java index 42ba5c1..ef8ab6a 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java +++ b/src/main/java/org/jcnc/jnotepad/ui/module/TerminalEmulatorComponent.java @@ -1,10 +1,9 @@ package org.jcnc.jnotepad.ui.module; import javafx.application.Platform; -import javafx.geometry.Pos; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; -import javafx.scene.layout.VBox; +import javafx.scene.layout.BorderPane; import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.LineNumberFactory; @@ -13,13 +12,20 @@ import java.io.IOException; import java.io.InputStreamReader; /** + * 终端仿真器组件,用于执行命令并显示输出。 + *

+ * 该组件包括一个用于输入命令的文本字段和一个显示命令输出的CodeArea。 + * 用户可以在文本字段中输入命令,按回车键执行,并在CodeArea中查看输出。 + * * @author luke */ -public class TerminalEmulatorComponent extends VBox { +public class TerminalEmulatorComponent extends BorderPane { private CodeArea terminalOutput; - private Process process; + /** + * 创建一个新的终端仿真器组件。 + */ public TerminalEmulatorComponent() { init(); } @@ -39,18 +45,15 @@ public class TerminalEmulatorComponent extends VBox { } }); - getChildren().addAll(terminalOutput, commandInput); - setAlignment(Pos.CENTER); - - // 设置布局样式和大小 - setSpacing(10); + setCenter(terminalOutput); + setBottom(commandInput); } private void executeCommand(String command) { try { ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); processBuilder.redirectErrorStream(true); - process = processBuilder.start(); + Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); String line; diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java index baf134e..cbb2f53 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/RootBottomSideBarVerticalBox.java @@ -2,7 +2,6 @@ package org.jcnc.jnotepad.views.root.bottom; import javafx.scene.layout.VBox; import org.jcnc.jnotepad.ui.module.AbstractVerticalBox; -import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent; import org.jcnc.jnotepad.views.root.bottom.cmd.CmdStatusBox; import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; @@ -29,10 +28,7 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { public void initSidebarVerticalBox() { bottomSideBarVerticalBox = new VBox(); - TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); - - - bottomSideBarVerticalBox.getChildren().addAll(terminal,CmdStatusBox.getInstance(), BottomStatusBox.getInstance()); + bottomSideBarVerticalBox.getChildren().addAll(CmdStatusBox.getInstance(), BottomStatusBox.getInstance()); getChildren().addAll(bottomSideBarVerticalBox); @@ -45,13 +41,4 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox { initSidebarVerticalBox(); } - /** - * 获取 bottomSideBarVerticalBox 实例。 - * - * @return bottomSideBarVerticalBox 的实例 - */ - public VBox getBottomSideBarVerticalBox() { - return bottomSideBarVerticalBox; - } - } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java index 30474a4..74842f6 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/bottom/cmd/CmdStatusBox.java @@ -1,18 +1,29 @@ package org.jcnc.jnotepad.views.root.bottom.cmd; import javafx.geometry.Insets; +import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; +import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; +import javafx.stage.Stage; import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent; +import org.jcnc.jnotepad.util.UiUtil; /** + * CmdStatusBox 类表示应用程序的命令状态框。 + *

+ * 该框包括一个菜单栏,用于运行、终端和构建命令。用户可以点击终端菜单项以切换终端的显示状态。 + * 终端显示时,将创建一个新的窗口以显示终端模拟器组件。 + * * @author luke */ public class CmdStatusBox extends HBox { + Stage terminalStage = new Stage(); + private static final CmdStatusBox CMD_STATUS_BOX = new CmdStatusBox(); /** @@ -24,10 +35,18 @@ public class CmdStatusBox extends HBox { initStatusBox(); } + /** + * 获取 CmdStatusBox 的实例。 + * + * @return CmdStatusBox 的实例 + */ public static CmdStatusBox getInstance() { return CMD_STATUS_BOX; } + /** + * 初始化命令状态框。 + */ public void initStatusBox() { var menuBar = new MenuBar(); HBox.setHgrow(menuBar, Priority.ALWAYS); @@ -53,21 +72,47 @@ public class CmdStatusBox extends HBox { this.getChildren().add(menuBar); } + /** + * 切换终端的显示/隐藏状态。 + */ private void toggleTerminal() { if (terminalVisible) { // 隐藏终端 terminalVisible = false; - // 在这里添加隐藏终端的代码 + hideTerminal(); } else { // 显示终端 terminalVisible = true; - showTerminal(); // 显示终端 + showTerminal(); } } - private void showTerminal() { - TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); - // 在这里添加显示终端的代码 + /** + * 隐藏终端窗口。 + */ + private void hideTerminal() { + terminalStage.close(); + } + /** + * 显示终端窗口。 + */ + private void showTerminal() { + // 创建一个新的舞台(窗口) + terminalStage.setTitle("终端"); + terminalStage.getIcons().add(UiUtil.getAppIcon()); + + // 创建一个根节点(布局) + BorderPane root = new BorderPane(); + Scene scene = new Scene(root, UiUtil.getAppWindow().getWidth() - 50, UiUtil.getAppWindow().getHeight() / 3); + + // 创建TerminalEmulatorComponent并添加到根节点 + TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); + + root.setCenter(terminal); + terminalStage.setScene(scene); + + // 显示窗口 + terminalStage.show(); } }