增加本地终端

This commit is contained in:
许轲 2023-09-18 00:22:15 +08:00
parent e561439b4d
commit 2965a9283d
3 changed files with 64 additions and 29 deletions

View File

@ -1,10 +1,9 @@
package org.jcnc.jnotepad.ui.module; package org.jcnc.jnotepad.ui.module;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox; import javafx.scene.layout.BorderPane;
import org.fxmisc.richtext.CodeArea; import org.fxmisc.richtext.CodeArea;
import org.fxmisc.richtext.LineNumberFactory; import org.fxmisc.richtext.LineNumberFactory;
@ -13,13 +12,20 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
/** /**
* 终端仿真器组件用于执行命令并显示输出
* <p>
* 该组件包括一个用于输入命令的文本字段和一个显示命令输出的CodeArea
* 用户可以在文本字段中输入命令按回车键执行并在CodeArea中查看输出
*
* @author luke * @author luke
*/ */
public class TerminalEmulatorComponent extends VBox { public class TerminalEmulatorComponent extends BorderPane {
private CodeArea terminalOutput; private CodeArea terminalOutput;
private Process process;
/**
* 创建一个新的终端仿真器组件
*/
public TerminalEmulatorComponent() { public TerminalEmulatorComponent() {
init(); init();
} }
@ -39,18 +45,15 @@ public class TerminalEmulatorComponent extends VBox {
} }
}); });
getChildren().addAll(terminalOutput, commandInput); setCenter(terminalOutput);
setAlignment(Pos.CENTER); setBottom(commandInput);
// 设置布局样式和大小
setSpacing(10);
} }
private void executeCommand(String command) { private void executeCommand(String command) {
try { try {
ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
processBuilder.redirectErrorStream(true); processBuilder.redirectErrorStream(true);
process = processBuilder.start(); Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
String line; String line;

View File

@ -2,7 +2,6 @@ package org.jcnc.jnotepad.views.root.bottom;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import org.jcnc.jnotepad.ui.module.AbstractVerticalBox; 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.cmd.CmdStatusBox;
import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox; import org.jcnc.jnotepad.views.root.bottom.status.BottomStatusBox;
@ -29,10 +28,7 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox {
public void initSidebarVerticalBox() { public void initSidebarVerticalBox() {
bottomSideBarVerticalBox = new VBox(); bottomSideBarVerticalBox = new VBox();
TerminalEmulatorComponent terminal = new TerminalEmulatorComponent(); bottomSideBarVerticalBox.getChildren().addAll(CmdStatusBox.getInstance(), BottomStatusBox.getInstance());
bottomSideBarVerticalBox.getChildren().addAll(terminal,CmdStatusBox.getInstance(), BottomStatusBox.getInstance());
getChildren().addAll(bottomSideBarVerticalBox); getChildren().addAll(bottomSideBarVerticalBox);
@ -45,13 +41,4 @@ public class RootBottomSideBarVerticalBox extends AbstractVerticalBox {
initSidebarVerticalBox(); initSidebarVerticalBox();
} }
/**
* 获取 bottomSideBarVerticalBox 实例
*
* @return bottomSideBarVerticalBox 的实例
*/
public VBox getBottomSideBarVerticalBox() {
return bottomSideBarVerticalBox;
}
} }

View File

@ -1,18 +1,29 @@
package org.jcnc.jnotepad.views.root.bottom.cmd; package org.jcnc.jnotepad.views.root.bottom.cmd;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.Menu; import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar; import javafx.scene.control.MenuBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority; import javafx.scene.layout.Priority;
import javafx.stage.Stage;
import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent; import org.jcnc.jnotepad.ui.module.TerminalEmulatorComponent;
import org.jcnc.jnotepad.util.UiUtil;
/** /**
* CmdStatusBox 类表示应用程序的命令状态框
* <p>
* 该框包括一个菜单栏用于运行终端和构建命令用户可以点击终端菜单项以切换终端的显示状态
* 终端显示时将创建一个新的窗口以显示终端模拟器组件
*
* @author luke * @author luke
*/ */
public class CmdStatusBox extends HBox { public class CmdStatusBox extends HBox {
Stage terminalStage = new Stage();
private static final CmdStatusBox CMD_STATUS_BOX = new CmdStatusBox(); private static final CmdStatusBox CMD_STATUS_BOX = new CmdStatusBox();
/** /**
@ -24,10 +35,18 @@ public class CmdStatusBox extends HBox {
initStatusBox(); initStatusBox();
} }
/**
* 获取 CmdStatusBox 的实例
*
* @return CmdStatusBox 的实例
*/
public static CmdStatusBox getInstance() { public static CmdStatusBox getInstance() {
return CMD_STATUS_BOX; return CMD_STATUS_BOX;
} }
/**
* 初始化命令状态框
*/
public void initStatusBox() { public void initStatusBox() {
var menuBar = new MenuBar(); var menuBar = new MenuBar();
HBox.setHgrow(menuBar, Priority.ALWAYS); HBox.setHgrow(menuBar, Priority.ALWAYS);
@ -53,21 +72,47 @@ public class CmdStatusBox extends HBox {
this.getChildren().add(menuBar); this.getChildren().add(menuBar);
} }
/**
* 切换终端的显示/隐藏状态
*/
private void toggleTerminal() { private void toggleTerminal() {
if (terminalVisible) { if (terminalVisible) {
// 隐藏终端 // 隐藏终端
terminalVisible = false; terminalVisible = false;
// 在这里添加隐藏终端的代码 hideTerminal();
} else { } else {
// 显示终端 // 显示终端
terminalVisible = true; 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();
} }
} }