把主界面写完了,是一个丑陋而不失美丽的设计。
1. 决定用TreeView做右边的文件展示。
关于TreeView:就是常见的树的概念。有一个根节点,根节点可以塞若干子节点,子节点里还能塞子节点。用JavaFX的话说就是
TreeItem<HBox> rootNode = new TreeItem<>(hBox); TreeItem<HBox> node = new TreeItem<>(hBox); rootNode.getChildren().add(node); TreeView<HBox> treeView = new TreeView<>(); treeView.setRoot(rootNode);
考虑根据文件的路径分类,就是把一个文件夹下的文件放一起用TreeView展示。但感觉层数太多屏幕空间不够,好像用处也不大,就没有加。
实际上还有一个TreeTableView,更适合分格子,但TreeTableView的用法是定义每一列,然后加一个方法告诉它怎么获取内容。不如写好组件塞TreeView里。
TreeView里的子节点是要动态添加的,所以写了一个单独的组件,就是每一行,包含一个checkbox,一个TextArea和三个icon。
为了防止展示重复的文件,维护一个HashMap根据路径去重。
2. 找一些icon
用了比较常见的Ikonli,有对应JDK8的2.6.0版本和对应JDK11+的12.3.1版本。添加依赖:
<!--javafx icon--> <dependency> <groupId>org.kordamp.ikonli</groupId> <artifactId>ikonli-javafx</artifactId> <version>12.3.1</version> </dependency> <dependency> <groupId>org.kordamp.ikonli</groupId> <artifactId>ikonli-fontawesome-pack</artifactId> <version>12.3.1</version> </dependency>
加一个ikonli-fontawesome-pack包,这样就可以用这套icon:Fontawesome
使用样例:
<Button> <graphic> <FontIcon iconLiteral="fa-file-pdf-o"/> </graphic> </Button>
3. 屏幕空间分配
PDF预览占70%,文件列表占30%。在父节点里绑定一下。试过node.getParent然后绑定宽度,不太好用。
由于PDFView实际上是一个HBox里套了fxPDF的组件,所以把fxPDF的prefwidth设为10000,填满父容器。
FileView里有一个Scrollpane,不能单纯设成inf来填满父容器。
4. 调整scrollpane
接下来把treeview塞进scrollpane里,防止列表过长。但JavaFX的scrollpane是二维的,横竖都可以滚动。我们并不希望有一个横着的滚动条,所以先
scrollPane.setFitToWidth(true); scrollPane.addEventFilter(ScrollEvent.SCROLL, event -> { if (event.getDeltaX() != 0) { event.consume(); } });
调整宽度,把滚动禁掉,防止里面有一个textarea的情况下越滚越长。
但此时scrollpane的子节点过长还是会显示横向滚动条,试了一圈没找到办法把它禁掉,只能曲线救国试图控制子节点大小。子节点大小取决于TextArea,和最外层宽度绑定一下,两边的checkbox和icons的宽度是固定的,所以把它的宽度设成
content.getTextArea().prefWidthProperty().bind(this.widthProperty().add(-170));
5. TextArea
TextArea也有两个滚动条,JavaFx别惦记你那滚动条了。设置wrapText="true"自动换行,取消横向滚动条。一开始想文本框高度随输入逐渐增高,一种方法是绑定scrollTopProperty
,文本框每次向下滚动就根据滚动长度自动增长。但滚动后会出现滚动条,对文字布局产生影响,增长的长度就不够了。思考之后选择固定长度为三行,够看就行。
下次写菜单栏功能的ui。