diff --git a/pom.xml b/pom.xml
index a1effb8e24523462b7635e6a4ecc64526847547a..674d8ebcc4314bbca8b88ea5943eaae7b6f8a5cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,20 @@
5.9.2
20.0.2
+
+
+
+ terminalfx-repo
+ https://github.com/javaterminal/terminalfx/raw/master/releases
+
+
+
+
+ com.kodedu.terminalfx
+ terminalfx
+ 1.2.0
+
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 8cefcaad530ff3909332959730a9fec1e4e939bd..6204a382a73b8412b38ba33612802e06ecd428cb 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -19,6 +19,7 @@ module org.jcnc.jnotepad {
requires java.desktop;
requires org.commonmark;
requires javafx.web;
+ requires com.kodedu.terminalfx;
exports org.jcnc.jnotepad;
exports org.jcnc.jnotepad.model.enums;
diff --git a/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java
index 1a43139b548d0c9453011de813f01f57769988d3..913a5a1ada77fb6fe4062f5ac09c68312cfc432c 100644
--- a/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java
+++ b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java
@@ -120,6 +120,7 @@ public class ApplicationManager {
instance.checkFileTabStatus(instance.getSelected());
}
});
+ primaryStage.setOnCloseRequest(event -> System.exit(0));
}
/**
diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java
index 955e4c631c05ea34b104dd956036cc8176cebb21..62460e5ae54e889d801649d94b56262f19a78972 100644
--- a/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java
+++ b/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java
@@ -1,15 +1,16 @@
package org.jcnc.jnotepad.component.module.vbox;
+import com.kodedu.terminalfx.TerminalBuilder;
+import com.kodedu.terminalfx.TerminalTab;
+import com.kodedu.terminalfx.config.TerminalConfig;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
-import org.jcnc.jnotepad.component.module.vbox.components.CmdTerminalBox;
import org.jcnc.jnotepad.component.module.vbox.components.DebugBox;
import org.jcnc.jnotepad.component.module.vbox.components.RunBox;
/**
* 底部Run,Debug,Cmd面板
*
- *
* @author cccqyu
*/
public class BuildPanel extends TabPane {
@@ -24,28 +25,25 @@ public class BuildPanel extends TabPane {
return instance;
}
- private final CmdTerminalBox cmdTerminalBox;
private final RunBox runBox;
private final DebugBox debugBox;
private BuildPanel() {
- cmdTerminalBox = new CmdTerminalBox();
+ TerminalConfig config = new TerminalConfig();
+ TerminalBuilder builder = new TerminalBuilder(config);
+ TerminalTab terminalTab = builder.newTerminal();
+ terminalTab.setClosable(false);
+
runBox = new RunBox();
debugBox = new DebugBox();
- Tab runTab = new Tab("运行",runBox);
+ Tab runTab = new Tab("运行", runBox);
runTab.setClosable(false);
Tab buildTab = new Tab("构建", debugBox);
buildTab.setClosable(false);
- Tab cmdTab = new Tab("终端",cmdTerminalBox);
- cmdTab.setClosable(false);
- this.getTabs().addAll(runTab,buildTab,cmdTab);
- }
-
- public CmdTerminalBox getCmdTerminalBox() {
- return cmdTerminalBox;
+ this.getTabs().addAll(runTab, buildTab, terminalTab);
}
public RunBox getRunBox() {
diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java
deleted file mode 100644
index 3d7951adff16651e0765c118fe03ba00bf5fd18c..0000000000000000000000000000000000000000
--- a/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package org.jcnc.jnotepad.component.module.vbox.components;
-
-import javafx.animation.KeyFrame;
-import javafx.animation.Timeline;
-import javafx.application.Platform;
-import javafx.concurrent.Task;
-import javafx.geometry.Insets;
-import javafx.scene.control.TextField;
-import javafx.scene.layout.Priority;
-import javafx.scene.layout.VBox;
-import javafx.util.Duration;
-import org.fxmisc.richtext.StyleClassedTextArea;
-import org.jcnc.jnotepad.util.LogUtil;
-
-import java.io.*;
-import java.nio.charset.Charset;
-
-/**
- * 命令行终端界面。
- *
- * @author luke
- */
-public class CmdTerminalBox extends VBox {
-
- /**
- * 用于显示命令输出的文本区域
- */
- private final StyleClassedTextArea cmdOutput;
- /**
- * 用户输入命令的文本框
- */
- private final TextField cmdInput;
- /**
- * 用于运行命令的进程
- */
- private Process cmdProcess;
- /**
- * 用于向命令进程发送输入的写入器
- */
- private PrintWriter cmdInputWriter;
-
- String currentDirectory;
-
- /**
- * 创建CmdTerminal对象的构造函数。
- */
- public CmdTerminalBox() {
- // 创建UI元素
- cmdOutput = new StyleClassedTextArea();
- cmdInput = new TextField();
-
- // 设置CodeArea的大小策略和边距
- // 让CodeArea在垂直方向上扩展以填充剩余空间
- VBox.setVgrow(cmdOutput, Priority.ALWAYS);
- // 设置CodeArea的边距
- VBox.setMargin(cmdOutput, new Insets(8));
-
- // 添加输入框的Enter键监听器,按下Enter执行命令
- cmdInput.setOnAction(e -> executeCommand());
-
- // 创建布局
- getChildren().addAll(cmdOutput, cmdInput);
-
- // 获取当前工作目录的文件夹路径
- currentDirectory = System.getProperty("user.dir");
-
-
- // 创建并启动cmd进程,使用GBK字符编码
- try {
- cmdProcess = new ProcessBuilder("cmd.exe")
- // 设置CMD工作目录为当前文件夹路径
- .directory(new File(currentDirectory))
- .redirectErrorStream(true)
- .start();
- cmdInputWriter = new PrintWriter(new OutputStreamWriter(cmdProcess.getOutputStream(), Charset.forName("GBK")));
- } catch (IOException e) {
- LogUtil.getLogger(this.getClass()).info("已调用, {}", cmdProcess);
- }
-
-
- // 延迟执行打印当前文件夹路径的语句
- Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0.5), event -> {
- appendTextToCmdOutput(currentDirectory + ">" + "\n");
-
- }));
- timeline.setCycleCount(1);
- timeline.play();
-
- // 读取cmd的输出并显示在UI中
- InputStream cmdOutputInputStream = cmdProcess.getInputStream();
- BufferedReader reader = new BufferedReader(new InputStreamReader(cmdOutputInputStream, Charset.forName("GBK")));
-
- Thread cmdOutputThread = getCmdOutputThread(reader);
- cmdOutputThread.start();
-
- // 关闭cmd进程
- Platform.runLater(() -> getScene().getWindow().setOnCloseRequest(e -> {
- if (cmdProcess != null) {
- cmdProcess.destroy();
- }
- }));
- }
-
- private Thread getCmdOutputThread(BufferedReader reader) {
- Task cmdOutputTask = new Task<>() {
- @Override
- protected Void call() {
- String line;
- try {
- while ((line = reader.readLine()) != null) {
- final String outputLine = line + "\n";
- Platform.runLater(() -> appendTextToCmdOutput(outputLine));
- }
- } catch (IOException e) {
- LogUtil.getLogger(this.getClass()).info("已调用, {}", this);
- }
- return null;
- }
- };
- Thread cmdOutputThread = new Thread(cmdOutputTask);
- cmdOutputThread.setDaemon(true);
- return cmdOutputThread;
- }
-
- /**
- * 执行用户输入的命令。
- */
- private void executeCommand() {
- String command = cmdInput.getText();
- if (cmdProcess != null && command != null) {
- cmdInputWriter.println(command);
- cmdInputWriter.flush();
- cmdInput.clear();
- }
- }
-
- /**
- * 将文本追加到命令输出文本区域,并滚动到最后一行。
- *
- * @param text 要追加的文本
- */
- private void appendTextToCmdOutput(String text) {
- Platform.runLater(() -> {
- cmdOutput.appendText(text);
- // 将滚动条滚动到最后一行
- cmdOutput.moveTo(cmdOutput.getLength());
- cmdOutput.requestFollowCaret();
- });
- }
-}