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