我的目标是加载一个TreeView组件,该组件显示包含密码的文件夹。最终,这些文件夹中的实际文件夹和密码将从数据库中提取出来,但在此之前,我想进行一次试运行以确保TreeView组件能够真正显示。
这是我第一次尝试使用TreeView组件;窗口的其余部分将正确加载,但是TreeView本身不会显示。我已经看了一些youtube视频,并浏览了所有与TreeView相关的Stack Overflow帖子,据我了解,我正确地遵循了这些教程。显然,我做错了事,所以我希望有人可以看看我的代码,也许可以帮助确定我做错了什么(或建议更好的实现)。作为参考,我关注的教程是here。
当用户单击登录按钮时,“主”窗口本身将从另一个Controller类加载。登录屏幕使用一个FXML文件,而主窗口使用单独的FXML文件,该文件应加载TreeView。
主控制器:
public class MainController implements Initializable
{
@FXML
private BorderPane borderPane;
@FXML
private MenuBar menuBar;
@FXML
private TreeView<String> treeView;
//helper method to populate the main nodes
public ArrayList<TreeItem<String>> getFolders()
{
ArrayList<TreeItem<String>> folders = new ArrayList<>();
//populate the weblogin parent node
TreeItem<String> webLogins = new TreeItem<>("Web Logins");
webLogins.getChildren().addAll(getWebLogins());
//populate the printerLogins parent node
TreeItem<String> printerLogins = new TreeItem<>("Printer Logins");
printerLogins.getChildren().addAll(getPrinterPasswords());
folders.add(webLogins);
folders.add(printerLogins);
return folders;
}
//create the children nodes related to web logins
private ArrayList<TreeItem<String>> getWebLogins()
{
ArrayList<TreeItem<String>> webLogins = new ArrayList<>();
TreeItem<String> google = new TreeItem<>("google");
TreeItem<String> apple = new TreeItem<>("apple");
TreeItem<String> facebook = new TreeItem<>("facebook");
webLogins.add(google);
webLogins.add(apple);
webLogins.add(facebook);
return webLogins;
}
//create the children nodes related to printer passwords
private ArrayList<TreeItem<String>> getPrinterPasswords()
{
ArrayList<TreeItem<String>> printerPass = new ArrayList<TreeItem<String>>();
TreeItem<String> konica = new TreeItem<>("Konica Minolta");
TreeItem<String> ricoh = new TreeItem<>("Ricoh");
TreeItem<String> hp = new TreeItem<>("Hewlett Packard");
printerPass.add(konica);
printerPass.add(ricoh);
printerPass.add(hp);
return printerPass;
}
@Override
public void initialize(URL location, ResourceBundle resources)
{
ArrayList<TreeItem<String>> allFolders = getFolders();
treeView = new TreeView<>();
TreeItem<String> rootNode = new TreeItem<>("Folder Types");
rootNode.getChildren().addAll(allFolders);
this.treeView.setRoot(rootNode);
}
}
主窗口FXML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.TreeView?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane fx:id="borderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.passwordmanager.gui.controllers.MainController">
<top>
<MenuBar fx:id="menuBar" BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<left>
<TreeView fx:id="treeView" prefHeight="372.0" prefWidth="263.0" BorderPane.alignment="CENTER" />
</left>
</BorderPane>
在此先感谢所有看过这个的人,并尽力帮助我弄清楚我的错误是什么。