使用JavaFx模拟windows记事本

实现效果

Windows记事本

代码

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

import java.io.FileInputStream;
import java.io.FileOutputStream;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        // 在状态栏中加入各个按键
        Menu File = new Menu("File");
        MenuItem Open = new MenuItem("Open");
        MenuItem Save = new MenuItem("Save");
        MenuItem Clear = new MenuItem("Clear");
        MenuItem Exit = new MenuItem("Exit");
        // 图标显示
        ImageView openImg = new ImageView(new Image("https://pic1.superbed.cn/item/5de106098e0e2e3ee9176a94.png"));
        ImageView saveImg = new ImageView(new Image("https://pic3.superbed.cn/item/5de107a78e0e2e3ee9179dda.png"));
        Open.setGraphic(openImg);
        Save.setGraphic(saveImg);
        File.getItems().addAll(Open, Save, Clear, Exit);

        // 建立一个顶部状态栏
        MenuBar menuBar = new MenuBar();
        menuBar.prefWidthProperty().bind(primaryStage.widthProperty());
        menuBar.getMenus().add(File);

        // 点击Exit直接退出程序
        Exit.setOnAction(e -> {
            Platform.exit();
        });

        // 第二行图标
        HBox two = new HBox();
        Button opens = new Button();
        Button saves = new Button();
        opens.setStyle("-fx-background-image: url('https://pic3.superbed.cn/item/5de1058b8e0e2e3ee9175771.png')");
        opens.setMinSize(48, 48);
        saves.setStyle("-fx-background-image: url('https://pic2.superbed.cn/item/5de1075e8e0e2e3ee9179528.png')");
        saves.setMinSize(48, 48);
        two.setSpacing(30);
        two.getChildren().addAll(opens, saves);

        // 第三行设置前景色
        VBox qjs = new VBox();
        Text Qcolor = new Text("前景色:");
        ColorPicker qspick = new ColorPicker();
        qspick.setValue(Color.CORAL);
        qjs.getChildren().addAll(Qcolor, qspick);

        // 第三行设置后景色
        VBox bjs = new VBox();
        Text Bcolor = new Text("背景色:");
        ColorPicker bspick = new ColorPicker();
        bspick.setValue(Color.CORAL);
        bjs.getChildren().addAll(Bcolor, bspick);

        // 合并第三行
        HBox three = new HBox();
        three.setSpacing(30);
        three.getChildren().addAll(qjs, bjs);
        three.setAlignment(Pos.CENTER);

        // 顶部打包
        VBox top = new VBox();
        Separator line1 = new Separator();
        Separator line2 = new Separator();
        top.setSpacing(3);
        top.getChildren().addAll(menuBar, two, line1, three);

        // 文本输入
        TextArea textArea = new TextArea();
        Rectangle rectangle = new Rectangle(0, 0, 600, 650);
        StackPane stackPane = new StackPane();
        stackPane.getChildren().addAll(rectangle, textArea);
        textArea.setStyle("border:0; background-color:transparent; overflow: hidden; border-style:none;");
        rectangle.setFill(Color.color(0.5, 0.5, 0.5));

        // 前景色改变字体颜色
        qspick.setOnAction(e -> {
            changeColor(qspick, bspick, textArea);
        });

        // 背景色改变背景颜色
        bspick.setOnAction(e -> {
            changeColor(qspick, bspick, textArea);
        });

        // 点击菜单栏clear
        Clear.setOnAction(e -> {
            textArea.setText("");
        });

        // 点击顶部Open
        Open.setOnAction(e -> {
            open(primaryStage, textArea);
        });

        // 点击openimg
        opens.setOnMouseClicked(e -> {
            open(primaryStage, textArea);
        });

        // 点击顶部保存
        Save.setOnAction(e -> {
            save(primaryStage, textArea);
        });

        // 点击saveimg
        saves.setOnMouseClicked(e -> {
            save(primaryStage, textArea);
        });

        BorderPane root = new BorderPane();
        root.setTop(top);
        root.setCenter(stackPane);
        Scene scene = new Scene(root, 600, 650);
        primaryStage.setTitle("EditPlus");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 打开读入文件的操作
    static void open(Stage stage, TextArea textArea) {
        FileChooser fp = new FileChooser();
        fp.setTitle("选择文件——打开");
        java.io.File file = fp.showOpenDialog(stage);
        if (file != null && file.exists()) {
            try {
                // 读取数据放入多行文本
                FileInputStream in = new FileInputStream(file);
                byte[] bs = new byte[(int)file.length()];
                in.read(bs);
                // 将内容设置到多行文本框
                textArea.setText(new String(bs));
                in.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    // 保存文件的操作
    static void save(Stage stage, TextArea textArea) {
        FileChooser fc = new FileChooser();
        fc.setTitle("选择文件-保存");
        java.io.File file = fc.showSaveDialog(stage);
        if (file!=null) {
            //将多行文本框中的内容写到file指向的文件中去
            try {
                //创建输出流
                FileOutputStream out = new FileOutputStream(file);
                out.write(textArea.getText().getBytes());
                out.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    // 更改颜色
    private static void changeColor(ColorPicker one, ColorPicker two, TextArea textArea) {
        String temp1 = String.format("%s", one.getValue());
        String temp2 = String.format("%s", two.getValue());
        textArea.setStyle(String.format("-fx-text-fill: #%s; background: #%s", temp1.substring(2), temp2.substring(2)));
    }
}

后记

以上的图标是通过网络查找进行下载的,下载后的图标上传存在了聚合图床中,程序运行的时候通过url访问得到图标的样式。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值