基于JavaFx的 一个小工具的实现

本篇我们对 Java全栈开发这篇博客https://blog.csdn.net/pianai_s/article/details/89762176 写了一个工具

先看效果图

首页
在这里插入图片描述
详情
在这里插入图片描述
搜索 ,文本框输入文字自动搜索
在这里插入图片描述
在这里插入图片描述

先看功能的实现核心代码

绿色箭头

 //back
        ImageView back = new ImageView(new Image(ResourcesUtils.
                getJarFilePath(OnlyReadRes.backPic)));
        back.setFitHeight(32);
        back.setFitWidth(32);

加载本地文本,使用绝对路径

private void loadTxt() {
        buffReadTextFile("E:/soft-dev-workspace/files/blog.txt");
    }

本地txt文本文件位置
在这里插入图片描述
加载本地文件会对
private static List imagesList = new ArrayList<>();
private static List contList = new ArrayList<>();
进行添加“首页”和“详情”

 public static void buffReadTextFile(String fileName) {
        // Java7 新增 try后面加的括号
        // 括号里面是必须显式关闭的物理资源,如数据库连接、网络连接、磁盘文件
        // 在try语句结束时自动关闭该资源,不需要finally 判断关闭了
        StringBuilder strBuilder = new StringBuilder();
        try ( // 创建输入流对象
              // 文件不存在会抛出java.io.FileNotFoundException
              BufferedReader br = new BufferedReader(new FileReader(fileName));
        ) {

            String line = null;
            //int row = 0; //行数
            int nowBookPos = 0; //当前book位置
            int bookId = 0;
            //逐行读取
            while ((line = br.readLine()) != null) {
                //判断是否是标题
                if (line.contains("-------")) {
                    nowBookPos++; //当前位置自增一
                    //++bookId表示自增1后再参与运算,所以从1开始
                    imagesList.add(new Books(line.trim().replace("-", ""), ++bookId, new Date()));
                    //放入标题
                } else {
                    //nowBookPos一定是之前的,由于第一个位置为0,所以减一
                    Integer id = imagesList.get(nowBookPos - 1).getId();
                    contList.add(new Content(id, line));//将此行添加到contList
                    //根据标题
                }
                strBuilder.append(line);
                //row++;
            }
            //System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }

    }

上门来自这个工具类Java可直接使用的工具类 - CharStreamUtil (NIO处理字符字节流)找到这个方法。

在这里插入图片描述
这里逐行读取文本

public static String buffReadTextFile(String fileName) {
		// Java7 新增 try后面加的括号
		// 括号里面是必须显式关闭的物理资源,如数据库连接、网络连接、磁盘文件
		// 在try语句结束时自动关闭该资源,不需要finally 判断关闭了
		StringBuilder strBuilder = new StringBuilder();
		try ( // 创建输入流对象
			  // 文件不存在会抛出java.io.FileNotFoundException
				BufferedReader br = new BufferedReader(new FileReader(fileName));
		) {
			String line = null;
			//逐行读取
			while ((line = br.readLine()) != null) {
				strBuilder.append(line);
			}

		} catch (Exception e) {

		}

		return strBuilder.toString();
	}

第一次打开界面初始化和返回箭头触发

//第一次打开界面初始化和返回箭头触发
    private void firstInit() {
        if (vbox.getChildren().contains(webView))
        {
            vbox.getChildren().removeAll(webView);
            vbox.getChildren().add(gridPane);
        }

        if (gridPane != null)
            gridPane.getChildren().clear();
        //根据请求到的数据生成控件
        //List<GridPane> lists = new ArrayList<>();
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        //lists.add(paneRow1);
        for (int i = 0; i < imagesList.size(); i++) {
            Books data = imagesList.get(i);
            //Date转 字符串日期 1977-09-01
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = sdf.format(data.getDate());
            Label label = new Label(data.getTitle());
            gridPane.addRow(i + 1,
                    new Text(String.valueOf(data.getId())),
                    label,
                    new Text(dateStr)
            );
            label.setCursor(Cursor.HAND);
            //点击"跳转"
            label.setOnMouseClicked(event -> {
                System.out.println(data.getId());
                goToDetail(data.getId());
                canBack = true; //允许返回
            });

        }
    }

输入框发生变化自动触发

//输入框发生变化触发
        searchTv.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                if (newValue.equals("")){
                    firstInit();
                }else {
                    search(newValue);
                }
            }
        });

绿色返回按钮事件

//返回按钮事件
        back.setOnMouseClicked(event -> {
            if (canBack) {
                firstInit();
                canBack = false;
            } else {

            }
        });

当输入框不为空自动触发

 //根据标题搜索
    private void search(String title){
        if (gridPane != null)
            gridPane.getChildren().clear();
        int pos = 0 ;
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        for (Books v: imagesList
             ) {

            //如果包含
            if (v.getTitle().contains(title)){
                Books data = v;
                    //Date转 字符串日期 1977-09-01
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    String dateStr = sdf.format(data.getDate());
                    Label label = new Label(data.getTitle());
                    gridPane.addRow( ++pos,
                            new Text(String.valueOf(data.getId())),
                            label,
                            new Text(dateStr)
                    );
                    label.setCursor(Cursor.HAND);
                    //点击"跳转"
                    label.setOnMouseClicked(event -> {
                        System.out.println(data.getId());
                        goToDetail(data.getId());
                        canBack = true; //允许返回
                    });


            }
        }
    }

点击标题进入的详情页


    //详情页
    private void goToDetail(Integer id) {
        List<Content> list = searchById(id);
        if (vbox != null)
            vbox.getChildren().removeAll(gridPane);
        String [] args = new String[list.size()] ;
        for (int i = 0; i < list.size(); i++) {
            args[i] = list.get(i).getContent();
        }

         webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        webEngine.loadContent(generateHtml(args));
        //gridPane.addRow(webView);
        VBox.setVgrow(webView, Priority.ALWAYS);
        vbox.getChildren().add(webView);
    }

详情页使用的是一个WebView,这里是拼接一段html代码,为什么用WebView,因为可以很方便复制其中文本,还可以加入图像等

 //生成一段html
    private String generateHtml(String ...args){
        String statement = "<!DOCTYPE html>\n" +
                "<html>";
        String head = "<head>\n" +
                "\t\t<meta charset=\"utf-8\" />\n" +
                "\t\t<title></title>\n" +
                "\t</head>";
        String last = "</html>";

        StringBuilder builder = new StringBuilder();

        builder.append(statement);
        builder.append(head);
        builder.append("<body>");
        for (String v: args
             ) {
            builder.append("<h3>"+v+"</h3>");
        }

        builder.append("</body>");
        builder.append(last);
        return builder.toString();
    }

其他

java 8新增的Stream操作

 //java 8新增的Stream操作
    private Set<Books> filterById(String id) {
        Set<Books> beans = booksSet.stream().
                filter(bean -> bean.getId().equals(id)).collect(Collectors.toSet());
        return beans;
    }

根据id获取 Content

 //根据id获取 Content
    private List<Content> searchById(Integer id) {
        List<Content> contentList = contList.stream()
                .filter(bean -> bean.getId().equals(id)).collect(Collectors.toList());
        return contentList;
    }

完整代码

MyBookController2
在这里插入图片描述

package sugar.base2.controller;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.control.ToolBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import sugar.base2.onlyOp.OnlyReadRes;
import sugar.base2.pojos.Books;
import sugar.base2.pojos.Content;
import sugar.utils.fxapp.ResourcesUtils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class MyBookController2 implements Initializable {
    private static Set<Books> booksSet = new HashSet<>();
    //封面
    private static List<Books> imagesList = new ArrayList<>();
    private static List<Content> contList = new ArrayList<>();

    private boolean canBack;
    private WebView webView;
    @FXML
    GridPane gridPane;

    @FXML
    ScrollPane scPane;

    @FXML
    TextField searchTv;

    @FXML
    ToolBar topBar;

    @FXML
    VBox vbox;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        //back
        ImageView back = new ImageView(new Image(ResourcesUtils.
                getJarFilePath(OnlyReadRes.backPic)));
        back.setFitHeight(32);
        back.setFitWidth(32);
        topBar.getItems().add(0, back);
        //
        scPane.setMinWidth(300);
        scPane.setMinHeight(300);
        scPane.setPadding(new Insets(18, 2, 2, 2));
        scPane.setFitToHeight(true);
        scPane.setFitToWidth(true);
        loadTxt();
        firstInit();

        //返回按钮事件
        back.setOnMouseClicked(event -> {
            if (canBack) {
                firstInit();
                canBack = false;
            } else {

            }
        });
        //输入框发生变化触发
        searchTv.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                if (newValue.equals("")){
                    firstInit();
                }else {
                    search(newValue);
                }
            }
        });
    }
    private void loadTxt() {
        buffReadTextFile("E:/soft-dev-workspace/files/blog.txt");
    }

    //第一次打开界面初始化和返回箭头触发
    private void firstInit() {
        if (vbox.getChildren().contains(webView))
        {
            vbox.getChildren().removeAll(webView);
            vbox.getChildren().add(gridPane);
        }

        if (gridPane != null)
            gridPane.getChildren().clear();
        //根据请求到的数据生成控件
        //List<GridPane> lists = new ArrayList<>();
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        //lists.add(paneRow1);
        for (int i = 0; i < imagesList.size(); i++) {
            Books data = imagesList.get(i);
            //Date转 字符串日期 1977-09-01
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = sdf.format(data.getDate());
            Label label = new Label(data.getTitle());
            gridPane.addRow(i + 1,
                    new Text(String.valueOf(data.getId())),
                    label,
                    new Text(dateStr)
            );
            label.setCursor(Cursor.HAND);
            //点击"跳转"
            label.setOnMouseClicked(event -> {
                System.out.println(data.getId());
                goToDetail(data.getId());
                canBack = true; //允许返回
            });

        }
    }

    //根据标题搜索
    private void search(String title){
        if (gridPane != null)
            gridPane.getChildren().clear();
        int pos = 0 ;
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        for (Books v: imagesList
             ) {

            //如果包含
            if (v.getTitle().contains(title)){
                Books data = v;
                    //Date转 字符串日期 1977-09-01
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    String dateStr = sdf.format(data.getDate());
                    Label label = new Label(data.getTitle());
                    gridPane.addRow( ++pos,
                            new Text(String.valueOf(data.getId())),
                            label,
                            new Text(dateStr)
                    );
                    label.setCursor(Cursor.HAND);
                    //点击"跳转"
                    label.setOnMouseClicked(event -> {
                        System.out.println(data.getId());
                        goToDetail(data.getId());
                        canBack = true; //允许返回
                    });


            }
        }
    }

    //详情页
    private void goToDetail(Integer id) {
        List<Content> list = searchById(id);
        if (vbox != null)
            vbox.getChildren().removeAll(gridPane);
        String [] args = new String[list.size()] ;
        for (int i = 0; i < list.size(); i++) {
            args[i] = list.get(i).getContent();
        }

         webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        webEngine.loadContent(generateHtml(args));
        //gridPane.addRow(webView);
        VBox.setVgrow(webView, Priority.ALWAYS);
        vbox.getChildren().add(webView);
    }

    //生成一段html
    private String generateHtml(String ...args){
        String statement = "<!DOCTYPE html>\n" +
                "<html>";
        String head = "<head>\n" +
                "\t\t<meta charset=\"utf-8\" />\n" +
                "\t\t<title></title>\n" +
                "\t</head>";
        String last = "</html>";

        StringBuilder builder = new StringBuilder();

        builder.append(statement);
        builder.append(head);
        builder.append("<body>");
        for (String v: args
             ) {
            builder.append("<h3>"+v+"</h3>");
        }

        builder.append("</body>");
        builder.append(last);
        return builder.toString();
    }



    //筛选
    //java 8新增的Stream操作
    //过滤满足符合条件的
    private Set<Books> filterByTitle(String t) {
        Set<Books> beans = booksSet.stream().
                filter(bean -> bean.getTitle().equals(t)).collect(Collectors.toSet());
        return beans;
    }
    //java 8新增的Stream操作
    private Set<Books> filterById(String id) {
        Set<Books> beans = booksSet.stream().
                filter(bean -> bean.getId().equals(id)).collect(Collectors.toSet());
        return beans;
    }

    //根据id获取 Content
    private List<Content> searchById(Integer id) {
        List<Content> contentList = contList.stream()
                .filter(bean -> bean.getId().equals(id)).collect(Collectors.toList());
        return contentList;
    }

    public static void buffReadTextFile(String fileName) {
        // Java7 新增 try后面加的括号
        // 括号里面是必须显式关闭的物理资源,如数据库连接、网络连接、磁盘文件
        // 在try语句结束时自动关闭该资源,不需要finally 判断关闭了
        //StringBuilder strBuilder = new StringBuilder();
        try ( // 创建输入流对象
              // 文件不存在会抛出java.io.FileNotFoundException
              BufferedReader br = new BufferedReader(new FileReader(fileName));
        ) {

            String line = null;
            //int row = 0; //行数
            int nowBookPos = 0; //当前book位置
            int bookId = 0;
            //逐行读取
            while ((line = br.readLine()) != null) {
                //判断是否是标题
                if (line.contains("-------")) {
                    nowBookPos++; //当前位置自增一
                    //++bookId表示自增1后再参与运算,所以从1开始
                    imagesList.add(new Books(line.trim().replace("-", ""), ++bookId, new Date()));
                    //放入标题
                } else {
                    //nowBookPos一定是之前的,由于第一个位置为0,所以减一
                    Integer id = imagesList.get(nowBookPos - 1).getId();
                    contList.add(new Content(id, line));//将此行添加到contList
                    //根据标题
                }
               // strBuilder.append(line);
                //row++;
            }
            //System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }

    }

}

MyBooksApp
在这里插入图片描述

package sugar.base2;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import sugar.utils.fxapp.ResourcesUtils;

public class MyBooksApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Parent p = ResourcesUtils.getFxmlFile("fxml/myBook.fxml");
        Scene scene = new Scene(p, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.setTitle("myBook");
        primaryStage.show();

    }

}

fxml/myBook.fxml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox fx:id="chooseV" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sugar.base2.controller.MyBookController2">

    <children>
      <ToolBar fx:id="topBar" prefHeight="40.0" prefWidth="200.0">
         <items>
            <Text strokeType="OUTSIDE" strokeWidth="0.0" text="输入关键字" />
            <TextField fx:id="searchTv" />
         </items>
      </ToolBar>
      <ScrollPane fx:id="scPane" prefHeight="600.0" prefWidth="600.0" VBox.vgrow="ALWAYS">
         <content>
            <VBox fx:id="vbox" fillWidth="true">
               <children>
                  <GridPane fx:id="gridPane" VBox.vgrow="ALWAYS">
                    <columnConstraints>
                      <ColumnConstraints hgrow="NEVER" minWidth="60.0" prefWidth="60.0" />
                        <ColumnConstraints hgrow="NEVER" minWidth="260.0" prefWidth="360.0" />
                        <ColumnConstraints hgrow="NEVER" minWidth="60.0" prefWidth="60.0" />
                    </columnConstraints>
                    <rowConstraints>
                        <RowConstraints minHeight="60.0" prefHeight="60.0" vgrow="NEVER" />
                    </rowConstraints>
                  </GridPane>
               </children>
            </VBox>
         </content>

      </ScrollPane>
   </children>
</VBox>

Books和Content实体类
在这里插入图片描述

package sugar.base2.pojos;

import java.util.Date;

public class Books {
    private String title;
    private Integer id;
    private Date date;

    public Books(String title, Integer id, Date date) {
        this.title = title;
        this.id = id;
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Books{" +
                "title='" + title + '\'' +
                ", id=" + id +
                ", date=" + date +
                '}';
    }
}

在这里插入图片描述

package sugar.base2.pojos;


public class Content {
    private Integer id;
    private String content;

    public Content(Integer id, String content) {
        this.id = id;
        this.content = content;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

之前的版本

MyBookController
在这里插入图片描述

package sugar.base2.controller;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import sugar.base2.onlyOp.OnlyReadRes;
import sugar.base2.pojos.Books;
import sugar.base2.pojos.Content;

import sugar.utils.fxapp.ResourcesUtils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class MyBookController implements Initializable {
    private static Set<Books> booksSet = new HashSet<>();
    //封面
    private static List<Books> imagesList = new ArrayList<>();
    private static List<Content> contList = new ArrayList<>();

    private boolean canBack;
    @FXML
    GridPane gridPane;

    @FXML
    ScrollPane scPane;

    @FXML
    TextField searchTv;

    @FXML
    ToolBar topBar;

    @FXML
    VBox vbox;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //back
        ImageView back = new ImageView(new Image(ResourcesUtils.
                getJarFilePath(OnlyReadRes.backPic)));
        back.setFitHeight(32);
        back.setFitWidth(32);


        topBar.getItems().add(0, back);
        //
        scPane.setMinWidth(300);
        scPane.setMinHeight(300);
        scPane.setPadding(new Insets(18, 2, 2, 2));
        scPane.setFitToHeight(true);
        scPane.setFitToWidth(true);
        loadTxt();
        firstInit();

        //返回
        back.setOnMouseClicked(event -> {
            if (canBack) {
                firstInit();
                canBack = false;
            } else {

            }

        });

        //更新ui  添加到GridPane
        //GridPaneUtils.setNodeToPane(gridPane,lists);
        //输入框发生变化触发
        searchTv.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                if (newValue.equals("")){
                    firstInit();
                }else {
                    search(newValue);
                }
            }
        });
    }

    private void firstInit() {
        if (gridPane != null)
            gridPane.getChildren().clear();
        //根据请求到的数据生成控件
        //List<GridPane> lists = new ArrayList<>();
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        //lists.add(paneRow1);
        for (int i = 0; i < imagesList.size(); i++) {
            Books data = imagesList.get(i);
            //Date转 字符串日期 1977-09-01
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = sdf.format(data.getDate());
            Label label = new Label(data.getTitle());
            gridPane.addRow(i + 1,
                    new Text(String.valueOf(data.getId())),
                    label,
                    new Text(dateStr)
            );
            label.setCursor(Cursor.HAND);
            //点击"跳转"
            label.setOnMouseClicked(event -> {
                System.out.println(data.getId());
                updateUi(data.getId());
                canBack = true; //允许返回
            });

        }
    }

    //根据标题搜索
    private void search(String title){
        if (gridPane != null)
            gridPane.getChildren().clear();
        int pos = 0 ;
        GridPane paneRow1 = new GridPane();
        paneRow1.setVgap(60);
        paneRow1.setHgap(60);
        paneRow1.addRow(0,
                new Text("ID"),
                new Text("标题"),
                new Text("更新日期")
        );
        gridPane.addRow(0, paneRow1);
        for (Books v: imagesList
             ) {

            //如果包含
            if (v.getTitle().contains(title)){
                Books data = v;
                    //Date转 字符串日期 1977-09-01
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    String dateStr = sdf.format(data.getDate());
                    Label label = new Label(data.getTitle());
                    gridPane.addRow( ++pos,
                            new Text(String.valueOf(data.getId())),
                            label,
                            new Text(dateStr)
                    );
                    label.setCursor(Cursor.HAND);
                    //点击"跳转"
                    label.setOnMouseClicked(event -> {
                        System.out.println(data.getId());
                        updateUi(data.getId());
                        canBack = true; //允许返回
                    });


            }
        }
    }

    private void updateUi(Integer id) {
        List<Content> list = searchById(id);
        if (gridPane != null)
            gridPane.getChildren().clear();
        for (int i = 0; i < list.size(); i++) {
            gridPane.addRow(i, new Text(list.get(i).getContent()));
        }

    }


    private void loadTxt() {
        buffReadTextFile("E:/soft-dev-workspace/files/blog.txt");
    }

    //筛选
    //java 8新增的Stream操作
    //过滤满足符合条件的
    private Set<Books> filterByTitle(String t) {
        Set<Books> beans = booksSet.stream().
                filter(bean -> bean.getTitle().equals(t)).collect(Collectors.toSet());
        return beans;
    }

    private Set<Books> filterById(String id) {
        Set<Books> beans = booksSet.stream().
                filter(bean -> bean.getId().equals(id)).collect(Collectors.toSet());
        return beans;
    }

    //根据id获取 Content
    private List<Content> searchById(Integer id) {
        List<Content> contentList = contList.stream()
                .filter(bean -> bean.getId().equals(id)).collect(Collectors.toList());
        return contentList;
    }

    public static void buffReadTextFile(String fileName) {
        // Java7 新增 try后面加的括号
        // 括号里面是必须显式关闭的物理资源,如数据库连接、网络连接、磁盘文件
        // 在try语句结束时自动关闭该资源,不需要finally 判断关闭了
        StringBuilder strBuilder = new StringBuilder();
        try ( // 创建输入流对象
              // 文件不存在会抛出java.io.FileNotFoundException
              BufferedReader br = new BufferedReader(new FileReader(fileName));
        ) {

            String line = null;
            int row = 0; //行数
            int nowBookPos = 0; //当前book位置
            int bookId = 0;
            //逐行读取
            while ((line = br.readLine()) != null) {
                //判断是否是标题
                if (line.contains("-------")) {
                    nowBookPos++; //当前位置自增一
                    //++bookId表示自增1后再参与运算,所以从1开始
                    imagesList.add(new Books(line.trim().replace("-", ""), ++bookId, new Date()));
                    //放入标题
                } else {
                    //nowBookPos一定是之前的,由于第一个位置为0,所以减一
                    Integer id = imagesList.get(nowBookPos - 1).getId();
                    contList.add(new Content(id, line));//将此行添加到contList
                    //根据标题
                }
                strBuilder.append(line);
                row++;
            }
            //System.out.println(row);
        } catch (Exception e) {
            System.out.println(e);
        }

    }

}

如果想使用MyBookController , 使用方法修改fxml/myBook.fxml
里面fx:controller="sugar.base2.controller.MyBookController"

在这里插入图片描述
区别就是跟之前详情页是这样的,没有使用webview,文本不可复制
在这里插入图片描述
后面再更新,进一步完善代码,让小工具功能更强大。

更新日志(2020-3-30)

关于关闭应用后台仍然在运行
在这里插入图片描述
解决方法
Javafx 应用退出后,相关后台进程并未退出,这是什么原因引起的 ?

在这个方法里添加如下代码
在这里插入图片描述

 primaryStage.setOnCloseRequest(event -> {
            System.exit(0);
        });

更新日志(2020-4-3)

新增本地打开文件
在这里插入图片描述
修改部分代码

链接: https://pan.baidu.com/s/1s2w4PHkwp06jCZH8Ao7sag
提取码: ai2s

更多JavaFx

http://www.javafxchina.net/blog/docs/tutorial1/
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值