如何在JavaFX中使用来自另一个Controller的(panel,anchorpane)组件

时间:2014-06-12 14:50:07

标签: java javafx javafx-2 javafx-8 fxml

在我的项目中,我在启动时使用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);

    } 

Project snapshot

在项目开始时制作menubox.setVisible(false);,但在投放期间,我想让menubox设置为true,但在ContentNavigator.loadContent(ContentNavigator.CONTENT1);

CONTENT1 fxml在点击该按钮时包含一个按钮,我希望menubox设置为true。 告诉我如何做到这一点。

1 个答案:

答案 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);
    }
}

还有很多其他方法可以解决这个问题。