如何从相同 class 的实例中引用相同的 FXML 元素
How can I reference the same FXML element from an instance of the same class
抱歉,我是 JavaFX 的新手。
我的设置:
我有一个主要的 FXML GUI,它一直显示。在这个主 GUI 中,我在 AnchorPane 中加载了另一个 FXML。
第二个 FXML 最初使用以下方式加载到此 AnchorPane(位于主 GUI 中):
@FXML
private AnchorPane rootSetPane;
然后我从那里使用 rootSetPane
。
这是位于同一主 GUI fxml 中的 AnchorPane。
<AnchorPane fx:id="rootSetPane" layoutX="228.0" prefHeight="710.0" prefWidth="887.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="228.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
初始化主控制器(始终显示主 GUI)
@Override
public void initialize(URL url, ResourceBundle rb) {
AnchorPane paneHome;
try {
paneHome = FXMLLoader.load(getClass().getResource("HomePage.fxml"));
rootSetPane.getChildren().setAll(paneHome);
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
此主程序中的工作方法示例 class(这是从同一主程序 FXML 中的按钮调用的):
@FXML
private void foodFinder(ActionEvent event) throws IOException {
AnchorPane paneFoodFinder = FXMLLoader.load(getClass().getResource("ScreenFoodFinder.fxml"));
rootSetPane.getChildren().setAll(paneFoodFinder);
}
无效方法示例(使用对象调用):
public void setPanel() throws IOException {
AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml"));
rootSetPane.getChildren().setAll(newPane);
}
我在程序中使用主 GUI 中的按钮多次设置了第二个窗格(这有效)。尝试从主控制器外部设置此窗格时会出现问题 class。我不能使用 Main class 的实例并调用方法来访问 rootSetPane
(而且我不能使 rootSetPane
静态化)。我收到 NullPointerException
。我确信这是一个业余错误。有没有一种方法可以使用上述方法来更改此 rootSetPane
。
或者我是否必须创建其他 classes 来管理我的屏幕。最简单(甚至是脏)的解决方案将不胜感激。
如果我能够在主 GUI 中触发一个按钮,它也会起作用,但这会导致同样的问题 (NullPointerException
)。我有一种感觉,我不能使用 class 的对象来引用元素,而且我也不能使这些元素成为静态的。
检查 getClass().getResource("NewPane.fxml")
是否指向正确的文件。
你可以创建一个扩展 AnchorPane
的 class。class 将成为 fxml.So 的控制器,你可以创建它的实例,例如:
SpecialAnchorClass anchor = new SpecialAnchorClass();
提到在 SceneBuilder 中你必须检查:
So your SpecialAnchorClass will be like this:
public class SpecialAnchorClass extends AnchorPane implements Initializable{
//..@fxml nodes
/**
* Constructor
*/
public SpecialAnchorClass(){
//FXMLLOADER
FXMLLoader loader = new FXMLLoader(getClass().getResource("..path to fxml file"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
//when this method is called every fxml component has been initialized
}
}
抱歉,我是 JavaFX 的新手。 我的设置: 我有一个主要的 FXML GUI,它一直显示。在这个主 GUI 中,我在 AnchorPane 中加载了另一个 FXML。
第二个 FXML 最初使用以下方式加载到此 AnchorPane(位于主 GUI 中):
@FXML
private AnchorPane rootSetPane;
然后我从那里使用 rootSetPane
。
这是位于同一主 GUI fxml 中的 AnchorPane。
<AnchorPane fx:id="rootSetPane" layoutX="228.0" prefHeight="710.0" prefWidth="887.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="228.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
初始化主控制器(始终显示主 GUI)
@Override
public void initialize(URL url, ResourceBundle rb) {
AnchorPane paneHome;
try {
paneHome = FXMLLoader.load(getClass().getResource("HomePage.fxml"));
rootSetPane.getChildren().setAll(paneHome);
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
此主程序中的工作方法示例 class(这是从同一主程序 FXML 中的按钮调用的):
@FXML
private void foodFinder(ActionEvent event) throws IOException {
AnchorPane paneFoodFinder = FXMLLoader.load(getClass().getResource("ScreenFoodFinder.fxml"));
rootSetPane.getChildren().setAll(paneFoodFinder);
}
无效方法示例(使用对象调用):
public void setPanel() throws IOException {
AnchorPane newPane = FXMLLoader.load(getClass().getResource("NewPane.fxml"));
rootSetPane.getChildren().setAll(newPane);
}
我在程序中使用主 GUI 中的按钮多次设置了第二个窗格(这有效)。尝试从主控制器外部设置此窗格时会出现问题 class。我不能使用 Main class 的实例并调用方法来访问 rootSetPane
(而且我不能使 rootSetPane
静态化)。我收到 NullPointerException
。我确信这是一个业余错误。有没有一种方法可以使用上述方法来更改此 rootSetPane
。
或者我是否必须创建其他 classes 来管理我的屏幕。最简单(甚至是脏)的解决方案将不胜感激。
如果我能够在主 GUI 中触发一个按钮,它也会起作用,但这会导致同样的问题 (NullPointerException
)。我有一种感觉,我不能使用 class 的对象来引用元素,而且我也不能使这些元素成为静态的。
检查 getClass().getResource("NewPane.fxml")
是否指向正确的文件。
你可以创建一个扩展 AnchorPane
的 class。class 将成为 fxml.So 的控制器,你可以创建它的实例,例如:
SpecialAnchorClass anchor = new SpecialAnchorClass();
提到在 SceneBuilder 中你必须检查:
So your SpecialAnchorClass will be like this:
public class SpecialAnchorClass extends AnchorPane implements Initializable{
//..@fxml nodes
/**
* Constructor
*/
public SpecialAnchorClass(){
//FXMLLOADER
FXMLLoader loader = new FXMLLoader(getClass().getResource("..path to fxml file"));
loader.setController(this);
loader.setRoot(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
//when this method is called every fxml component has been initialized
}
}