本篇我们对 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/