在我的项目中,我在启动时使用menubox在滚动窗格内添加一个新的fxml文件,menubox是setvisible(false);现在在内部滚动窗口中调用一个fxml,其中包含一个现在在控制器内部的按钮,我创建了一个使menubox可设置的函数(true)
我的完整代码:
ContentNavigator.java
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;
/**
*/
public class ContentNavigator {
//fxml files
public static String CONTENT1 = "masterLogin.fxml";
public static String CONTENT2 = "FeesAddItem.fxml";
public static String CONTENT3 = "home.fxml";
private static DashboardController mainController;
public static void setController(DashboardController controller){
ContentNavigator.mainController = controller;
}
public static void loadContent(String fxmlFile){
try {
mainController.setContent(
(AnchorPane) FXMLLoader.load(ContentNavigator.class.getResource(fxmlFile))
);
} catch (IOException ex) {
Logger.getLogger(ContentNavigator.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader();
AnchorPane mainWindow = (AnchorPane) loader.load(getClass().getResourceAsStream("masterboard.fxml"));
Scene scene = new Scene(mainWindow);
scene.getStylesheets().add("css/main.css");
stage.setTitle("JavaFX");
stage.setScene(scene);
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
DashboardController controller = loader.getController();
ContentNavigator.setController(controller);
ContentNavigator.loadContent(ContentNavigator.CONTENT1);
}
主板控制器
@Override
public void initialize(URL url, ResourceBundle rb) {
menubox.setVisible(false);
AnchorPane.setLeftAnchor(content1, 0.0);
}
在项目开始时制作menubox.setVisible(false);
,但在投放期间,我想让menubox
设置为true,但在ContentNavigator.loadContent(ContentNavigator.CONTENT1);
内
CONTENT1
fxml在点击该按钮时包含一个按钮,我希望menubox
设置为true。
告诉我如何做到这一点。
答案 0 :(得分:2)
我的结构对我来说并不是很清楚(“主板控制器”与DashboardController
相同吗?),但我认为我已经足够了。
在主板控制器中,只需创建并公开BooleanProperty
以确定菜单是否显示:
private final BooleanProperty menuShowing = new SimpleBooleanProperty(this, "menuShowing", false);
public final void setMenuShowing(boolean showing) {
menuShowing.set(showing);
}
public final boolean isMenuShowing() {
return menuShowing.get();
}
public BooleanProperty menuShowingProperty() {
return menuShowing ;
}
然后在你的initialize方法中将菜单的visible属性绑定到menuShowingProperty
:
public void initialize() {
menuBox.visibleProperty().bind(menuShowing);
}
现在,当您加载新内容时,您只需要为内容控制器提供对menuShowing
属性的引用。最简单的方法是:
// controller for individual content
public class ContentController {
private BooleanProperty menuShowingProperty ;
public void setMenuShowingProperty(BooleanProperty menuShowingProperty) {
this.menuShowingProperty = menuShowingProperty ;
}
public void initialize() {
// ...
}
// handler method for button that shows menu:
@FXML
private void showMenu() {
menuShowingProperty.set(true);
}
}
现在,当您加载内容时,请执行以下操作:
public static void loadContent(String fxmlFile){
try {
FXMLLoader loader = new FXMLLoader(ContentNavigator.class.getResource(fxmlFile));
AnchorPane pane = loader.<AnchorPane>load();
Object controller = loader.getController();
if (controller instanceof ContentController) {
ContentController contentController = (ContentController) controller ;
contentController.setMenuShowingProperty(mainController.menuShowingProperty());
}
mainController.setContent(pane);
} catch (IOException ex) {
Logger.getLogger(ContentNavigator.class.getName()).log(Level.SEVERE, null, ex);
}
}
还有很多其他方法可以解决这个问题。