为什么此 FXML 应用程序中未显示 TreeView 根目录?
Why isn't a TreeView root shown in this FXML app?
我正在开发一个 FXML 应用程序,我遇到了 运行 这个我无法解决的错误:由附加代码生成的 TreeViews 不显示它们的根,尽管我尽了最大努力他们应该知道的知识(TreeViews 本身确实显示)。按钮和标签工作正常。
题外话,initialize() 方法究竟应该做什么?目前,我只是在那里写一些东西,就像他们在教程中所做的那样,希望它能以某种方式出现。关于该方法,我只找到了关于 Initializable 接口的文档,这并没有让我变得更聪明。关于位置和资源,但就 Java 而言,这到底意味着什么?这些术语对于 google 来说太笼统了。
此外,该代码是从早期仅使用 Javafx 的应用程序复制过来的,没有 FXML,并且在那里使用得很好。那为什么它现在不起作用了?
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import java.io.IOException;
public class FolderSyncerMainWindowController {
final String FOLDER_SYNCER = "FolderSyncer";
final String BROWSE = "Browse";
final String SOURCE = "Source...";
final String TARGET = "Target...";
final String COMPARE = "Compare";
final String CANCEL = "Cancel";
final String SYNCHRONIZE = "Synchronize";
final String COMPARING = "Comparing, this may take several minutes.";
final String SYNCHRONIZING = "Synchronizing, this may take several minutes.";
final String DONE = "Done.";
@FXML
private Label sourceLabel;
@FXML
private Label targetLabel;
@FXML
private Button sourceBrowseButton;
@FXML
private Button targetBrowseButton;
@FXML
private Button compareButton;
@FXML
private Button synchronizeButton;
@FXML
private TreeView sourceTreeView;
@FXML
private TreeView targetTreeView;
@FXML
private TreeItem sourceTreeViewRoot;
@FXML
private TreeItem targetTreeViewRoot;
public void initialize() {
sourceLabel.setText(SOURCE);
targetLabel.setText(TARGET);
sourceBrowseButton.setText(BROWSE);
targetBrowseButton.setText(BROWSE);
compareButton.setText(COMPARE);
synchronizeButton.setText(SYNCHRONIZE);
sourceTreeViewRoot = new TreeItem<>();
targetTreeViewRoot = new TreeItem<>();
sourceTreeViewRoot.setExpanded(true);
targetTreeViewRoot.setExpanded(true);
sourceTreeView = new TreeView<>(sourceTreeViewRoot);
targetTreeView = new TreeView<>(targetTreeViewRoot);
sourceTreeView.setShowRoot(true);
targetTreeView.setShowRoot(true);
}
}
本论坛有几个相同的问题,但我快速搜索找不到。
初始化 @FXML
注释字段总是错误的。换句话说,你不应该写像
这样的代码
@FXML
private TreeView sourceTreeView ;
// ...
sourceTreeView = new TreeView<>(...);
@FXML
注释表示该字段引用由 FXMLLoader
创建的对象作为解析 fxml 文件的一部分;该对象被添加到场景图中。如果您随后使用 sourceTreeView = new TreeView...
重新分配引用,则引用不再指向作为场景图一部分的树视图。
相反,做
sourceTreeView.setRoot(sourceTreeViewRoot);
顺便说一句,您永远不应该使用原始类型 (TreeView
),而应该使用适当的泛型类型:TreeView<Something>
,其中 Something
是每个值的类型树项目。
我正在开发一个 FXML 应用程序,我遇到了 运行 这个我无法解决的错误:由附加代码生成的 TreeViews 不显示它们的根,尽管我尽了最大努力他们应该知道的知识(TreeViews 本身确实显示)。按钮和标签工作正常。
题外话,initialize() 方法究竟应该做什么?目前,我只是在那里写一些东西,就像他们在教程中所做的那样,希望它能以某种方式出现。关于该方法,我只找到了关于 Initializable 接口的文档,这并没有让我变得更聪明。关于位置和资源,但就 Java 而言,这到底意味着什么?这些术语对于 google 来说太笼统了。
此外,该代码是从早期仅使用 Javafx 的应用程序复制过来的,没有 FXML,并且在那里使用得很好。那为什么它现在不起作用了?
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import java.io.IOException;
public class FolderSyncerMainWindowController {
final String FOLDER_SYNCER = "FolderSyncer";
final String BROWSE = "Browse";
final String SOURCE = "Source...";
final String TARGET = "Target...";
final String COMPARE = "Compare";
final String CANCEL = "Cancel";
final String SYNCHRONIZE = "Synchronize";
final String COMPARING = "Comparing, this may take several minutes.";
final String SYNCHRONIZING = "Synchronizing, this may take several minutes.";
final String DONE = "Done.";
@FXML
private Label sourceLabel;
@FXML
private Label targetLabel;
@FXML
private Button sourceBrowseButton;
@FXML
private Button targetBrowseButton;
@FXML
private Button compareButton;
@FXML
private Button synchronizeButton;
@FXML
private TreeView sourceTreeView;
@FXML
private TreeView targetTreeView;
@FXML
private TreeItem sourceTreeViewRoot;
@FXML
private TreeItem targetTreeViewRoot;
public void initialize() {
sourceLabel.setText(SOURCE);
targetLabel.setText(TARGET);
sourceBrowseButton.setText(BROWSE);
targetBrowseButton.setText(BROWSE);
compareButton.setText(COMPARE);
synchronizeButton.setText(SYNCHRONIZE);
sourceTreeViewRoot = new TreeItem<>();
targetTreeViewRoot = new TreeItem<>();
sourceTreeViewRoot.setExpanded(true);
targetTreeViewRoot.setExpanded(true);
sourceTreeView = new TreeView<>(sourceTreeViewRoot);
targetTreeView = new TreeView<>(targetTreeViewRoot);
sourceTreeView.setShowRoot(true);
targetTreeView.setShowRoot(true);
}
}
本论坛有几个相同的问题,但我快速搜索找不到。
初始化 @FXML
注释字段总是错误的。换句话说,你不应该写像
@FXML
private TreeView sourceTreeView ;
// ...
sourceTreeView = new TreeView<>(...);
@FXML
注释表示该字段引用由 FXMLLoader
创建的对象作为解析 fxml 文件的一部分;该对象被添加到场景图中。如果您随后使用 sourceTreeView = new TreeView...
重新分配引用,则引用不再指向作为场景图一部分的树视图。
相反,做
sourceTreeView.setRoot(sourceTreeViewRoot);
顺便说一句,您永远不应该使用原始类型 (TreeView
),而应该使用适当的泛型类型:TreeView<Something>
,其中 Something
是每个值的类型树项目。