我有2个控制器和3个fxml文件。
1。控制器:
MainController.java
在这个控制器中,我使用BorderPane创建舞台和场景。在BorderPane的中心,我想改变布局(GridPane,HBox等)
public class MainController {
//Main BorderPane
private BorderPane borderPane;
@FXML
private void initialize() {
try {
FXMLLoader mainLoaderFXML = new FXMLLoader();
mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));
borderPane = (BorderPane) mainLoaderFXML.load();
Stage mainStage = new Stage();
mainStage.setTitle("Border Pane");
Scene mainScene = new Scene(borderPane);
mainStage.setScene(mainScene);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("CenterView1.fxml"));
//BorderPane in CenterView1.fxml
BorderPane centerView1 = (BorderPane) loader.load();
borderPane.setCenter(centerView1);
mainStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
//Get BorderPane
public BorderPane getBorderPane() {
return this.borderPane;
}
}
java
在SecondController中,我想用帮助RadioButton更改borderPane MainController的中心。
public class SecondController {
@FXML
private ToggleGroup radioButtons;
@FXML
private void initialize() {
radioButtons.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
public void changed(ObservableValue<? extends Toggle> ov,
Toggle old_toggle, Toggle new_toggle) {
if (radioButtons.getSelectedToggle() != null) {
RadioButton chk = (RadioButton)new_toggle.getToggleGroup().getSelectedToggle();
switch(chk.getText()){
case "rbFirst":
System.out.println("Default View CenterView1");
break;
case "rbSecond":
FXMLLoader mainLoaderFXML = new FXMLLoader();
mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));
MainController mainController = (MainController)mainLoaderFXML.getController();
//And now i want to change new FXML-file into center, but i have a NULLPointerException
System.out.println(mainController.getDefaultNormsLayout().setCenter("CenterView2"));
break;
}
}
}
});
}
}
2。fxml-file:
0.baseView.fxml-base view
1。centerview1.fxml(默认情况下)-它位于基本视图
2中心的BorderPane。centerview2.fxml-它是基本视图中心的DataGrid
当我单击rbSecond时,我在mainController.getDefaultNormsLayout()中看到NullPointerException。我知道它是什么,但我不知道如何修理它。我使用JavaFX类控制器场景引用,在这里输入链接描述等,但我不知道如何应用于我的任务。
谢谢!
从我的评论中回答:
nullpointer会出现,因为在FXMLLoader的加载操作之前没有初始化控制器。这将创建MainController类的另一个实例。如果没有覆盖默认的JavaFX,则该实例将与初始实例不同。请参见FXMLLoader类的setControllerFactory方法。请记住,不要重用FXMLLoader类是很重要的。
以下内容应确保mainController不再为null。
FXMLLoader mainLoaderFXML = new FXMLLoader();
mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));
mainLoaderFXML.load();
MainController mainController = (MainController)mainLoaderFXML.getController();
mainLoaderFxml.setControllerFactory(new Callback() {
public Object call(Class<?> clazz) {
return instance of your class;
}
}
我的BorderPane的中心有一个名为designView的堆栈窗格(FXML定义的堆栈窗格)。我试图在designView中获得一个可拖动的窗格。如果我将该窗格添加到rootView(我的BordePane)中,一切都很好。但是,如果我尝试将其添加到designView中,如下所示: 窗格在设计视图中显示正确,但不再可拖动。MouseEvents会触发,但窗格的位置没有更新。我认为问题在于la
我试图在javafx中制作一个面板,我习惯了一个边框窗格作为一个主要场景。中央面板有4个窗口(main1、main2、main3、main4),左面板有一个导航菜单。
我看到下面的链接-https://stackoverflow.com/questions/5302197/javafx-bug-is-there-a-way-to-force-repaint-this-not-a-single-threading-pr调用requestLayout似乎没有帮助。我还尝试在图中的各个节点上调用impl_updatePG和impl_transformsChanged。
主要内容:示例,实例-2BorderPane布局顶部,底部,左,右或中心区域中的子节点。每个区域只能有一个节点。BorderPane的顶部和底部区域允许可调整大小的节点占用所有可用宽度。 左边界区域和右边界区域占据顶部和底部边界之间的可用垂直空间。 默认情况下,所有边界区域尊重子节点的首选宽度和高度。放置在顶部,底部,左侧,右侧和中心区域中的节点的默认对齐方式如下: 顶部: 底部: 左侧: 右侧: 中心: 示例 将按钮添
我在将带有3个按钮的VBox放在BorderPane右侧部分的中心时遇到问题。有没有办法在FXML或CSS中实现这一点? 更新: 这是FXML中的代码 这是CSS文件 以及应用程序的屏幕截图。我希望Vbox位于BorderPate右侧部分的中心。非常感谢您的回复!
我有一个简单的JavaFX类,对于这个问题,它的结构是这样的。 BorderPane包含包含FlowPane的StackPane。 几天来,我一直试图让StackPane填充其父级BorderPane,但似乎没有任何效果。最终结果应该是StackPane的背景设置为“红色”。 代码: 我的应用程序正在运行的照片 所以基本上这个左侧区域应该完全填充我的BorderPane的左侧,因此背景应该正确覆盖