diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..b878016
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ org.example
+ JnotePad
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/src/main/java/JnotePad.java b/src/main/java/JnotePad.java
new file mode 100644
index 0000000..e75dfe1
--- /dev/null
+++ b/src/main/java/JnotePad.java
@@ -0,0 +1,197 @@
+import javafx.application.Application;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.image.Image;
+import javafx.scene.layout.BorderPane;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+
+import java.io.*;
+
+public class JnotePad extends Application {
+ String iconSrc = "img/icon.png";
+
+ // 定义菜单栏
+ MenuBar menuBar;
+ Menu fileMenu;
+ MenuItem newItem, openItem, saveItem, saveAsItem;
+
+ // 定义主界面
+ BorderPane root;
+
+ // 定义多个Tab页
+ TabPane tabPane;
+ int tabIndex = 0;
+
+ // 定义状态栏
+ Label statusLabel;
+
+ @Override
+ public void start(Stage primaryStage) {
+ primaryStage.setTitle("JnotePad");
+
+ // 创建菜单栏并添加菜单项
+ menuBar = new MenuBar();
+ fileMenu = new Menu("文件");
+ newItem = new MenuItem("新建");
+ openItem = new MenuItem("打开");
+ saveItem = new MenuItem("保存");
+ saveAsItem = new MenuItem("另存为");
+ fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem);
+ menuBar.getMenus().add(fileMenu);
+
+ // 为菜单项添加事件处理器
+ newItem.setOnAction(new NewFileEventHandler());
+ openItem.setOnAction(new OpenFileEventHandler());
+ saveItem.setOnAction(new SaveFileEventHandler());
+ saveAsItem.setOnAction(new SaveAsFileEventHandler());
+
+ // 创建主界面
+ root = new BorderPane();
+ root.setTop(menuBar);
+
+ // 创建Tab页和文本编辑区
+ tabPane = new TabPane();
+ root.setCenter(tabPane);
+
+ // 创建状态栏
+ statusLabel = new Label("行: 1 \t列: 1 \t字数: 0");
+ root.setBottom(statusLabel);
+ BorderPane.setMargin(statusLabel, new Insets(5, 10, 5, 10));
+
+ // 创建场景并设置主界面
+ Scene scene = new Scene(root, 800, 600);
+ primaryStage.setScene(scene);
+ primaryStage.getIcons().add(new Image(iconSrc));
+ primaryStage.show();
+ }
+
+ // 新建文件事件处理器
+ private class NewFileEventHandler implements EventHandler {
+ @Override
+ public void handle(ActionEvent event) {
+ TextArea textArea = new TextArea(); // 创建新的文本编辑区
+ Tab tab = new Tab("新建文件 " + ++tabIndex); // 创建新的Tab页
+ tab.setContent(textArea);
+ tabPane.getTabs().add(tab);
+ tabPane.getSelectionModel().select(tab);
+ updateStatusLabel(textArea);
+ }
+ }
+
+ // 打开文件事件处理器
+ private class OpenFileEventHandler implements EventHandler {
+ @Override
+ public void handle(ActionEvent event) {
+ FileChooser fileChooser = new FileChooser();
+ File file = fileChooser.showOpenDialog(null);
+ if (file != null) {
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String line;
+ StringBuilder textBuilder = new StringBuilder();
+ while ((line = reader.readLine()) != null) {
+ textBuilder.append(line).append("\n"); // 读取文件内容
+ }
+ reader.close();
+ String text = textBuilder.toString();
+
+ TextArea textArea = new TextArea(text); // 创建新的文本编辑区
+ Tab tab = new Tab(file.getName()); // 创建新的Tab页
+ tab.setContent(textArea);
+ tab.setUserData(file); // 将文件对象保存到Tab页的UserData中
+ tabPane.getTabs().add(tab);
+ tabPane.getSelectionModel().select(tab);
+ updateStatusLabel(textArea);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ // 保存文件事件处理器
+ private class SaveFileEventHandler implements EventHandler {
+ @Override
+ public void handle(ActionEvent event) {
+ Tab selectedTab = tabPane.getSelectionModel().getSelectedItem();
+ if (selectedTab != null) {
+ File file = (File) selectedTab.getUserData(); // 获取当前Tab页对应的文件对象
+ if (file.exists()) {
+ try {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ TextArea textArea = (TextArea) selectedTab.getContent(); // 获取当前Tab页的文本编辑区
+ String text = textArea.getText();
+ writer.write(text); // 写入文件内容
+ writer.flush();
+ writer.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ } else {
+ saveAsFile();
+ }
+ }
+ }
+ }
+
+ // 另存为文件事件处理器
+ private class SaveAsFileEventHandler implements EventHandler {
+ @Override
+ public void handle(ActionEvent event) {
+ saveAsFile();
+ }
+ }
+
+ // 另存为文件方法
+ private void saveAsFile() {
+ Tab selectedTab = tabPane.getSelectionModel().getSelectedItem();
+ if (selectedTab != null) {
+ FileChooser fileChooser = new FileChooser();
+ File file = fileChooser.showSaveDialog(null);
+ if (file != null) {
+ try {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(file));
+ TextArea textArea = (TextArea) selectedTab.getContent(); // 获取当前Tab页的文本编辑区
+ String text = textArea.getText();
+ writer.write(text); // 写入文件内容
+ writer.flush();
+ writer.close();
+ selectedTab.setText(file.getName()); // 更新Tab页标签上的文件名
+ selectedTab.setUserData(file); // 将文件对象保存到Tab页的UserData中
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ // 更新状态栏
+ private void updateStatusLabel(TextArea textArea) {
+ textArea.caretPositionProperty().addListener((observable, oldValue, newValue) -> {
+ int row = getRow(textArea.getCaretPosition(), textArea.getText());
+ int column = getColumn(textArea.getCaretPosition(), textArea.getText());
+ int length = textArea.getLength();
+ statusLabel.setText("行: " + row + " \t列: " + column + " \t字数: " + length);
+ });
+ }
+
+ // 获取光标所在行数
+ private int getRow(int caretPosition, String text) {
+ return text.substring(0, caretPosition).split("\n").length;
+ }
+
+
+ // 获取光标所在列数
+ private int getColumn(int caretPosition, String text) {
+ return caretPosition - text.lastIndexOf("\n", caretPosition - 1);
+ }
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+}
diff --git a/src/main/resources/img/icon.ico b/src/main/resources/img/icon.ico
new file mode 100644
index 0000000..e3c1800
Binary files /dev/null and b/src/main/resources/img/icon.ico differ
diff --git a/src/main/resources/img/icon.png b/src/main/resources/img/icon.png
new file mode 100644
index 0000000..e057380
Binary files /dev/null and b/src/main/resources/img/icon.png differ