工具栏没有隐藏在ParticleApplication上

时间:2016-04-28 19:51:48

标签: gluon gluon-desktop

我有以下代码:

@ParticleView(isDefault=true, name="login")
public class LoginView extends FXMLView {

   public LoginView() {
       super(LoginView.class.getResource("login.fxml"));
   }

   @Override
   public void start() {
       ((LoginController) getController()).postInit();
   }

   @Override
   public void stop() {
        ((LoginController) getController()).dispose();
 }

}

控制器相关代码是:

public class LoginController {
  @Inject
  ParticleApplication app;

  @Inject
  private ViewManager viewManager;

  @Inject
  private StateManager stateManager;

  @Inject
  private MenuBar menuBar;
  @Inject
  private ToolBar toolBar;
  @Inject
  private StatusBar statusBar;

  @FXML
  private TextField txfUsuario;
  @FXML
  private PasswordField txfPassword;

  public void initialize() {
    ActionMap.register(this);
  }

  public void postInit() {
      app.setShowCloseConfirmation(false);
      toolBar.setVisible(false);
      menuBar.setVisible(false);
  }
}

菜单栏不可见(但空间仍然存在)但工具栏仍然可见。

任何sugestions?

1 个答案:

答案 0 :(得分:0)

如果使用常规JavaFX应用程序运行此简短测试,您会注意到相同的行为:

@Override
public void start(Stage primaryStage) {
    ToolBar toolBar = new ToolBar(new Button("Click"));
    StackPane pane = new StackPane(new Label("A label"));
    pane.setStyle("-fx-background-color: yellow");
    BorderPane root = new BorderPane(pane);
    root.setTop(toolBar);

    Scene scene = new Scene(root, 300, 250);
    primaryStage.setScene(scene);
    primaryStage.show();

    toolBar.setVisible(false);
}

toolbar

根据JavaDoc的节点managed属性:

  

定义此节点的布局是否由其父节点管理。如果节点是受管理的,则它的父节点会将节点的几何因子分解为其自己的首选大小和layoutBounds计算,并在场景布局过程中将其布局。如果受管节点的layoutBounds发生更改,它将自动触发将场景图重新布局到最近的布局根(通常是场景的根节点)。

这意味着borderpane的顶部区域保持工具栏(默认情况下是托管)给出的首选大小,无论其可见性如何。

当您将ToolBar的可见性设置为false时,您还需要通过将managed设置为false来释放其空间:

@Override
public void start(Stage primaryStage) {
    ...       
    toolBar.setVisible(false);
    toolBar.setManaged(false);
}

修改

在您的情况下,您还有MenuBar,并且ToolBar managed属性已绑定到其可见性,因此您只需设置:

public void postInit() {
    app.setShowCloseConfirmation(false);
    Platform.runLater(() -> {
        toolBar.setVisible(false);

        menuBar.setVisible(false);
        menuBar.setManaged(false);
    });
}

注意:我添加了Platform.runLater():在显示舞台之前调用postInit()方法,这样就可以稍微延迟它并让控制在处理他们的能见度之前,要正确地进行渲染。

如果您想要恢复其可见性,这也应该有效:

public void setTopVisible() {
    toolBar.setVisible(true);

    menuBar.setVisible(true);
    menuBar.setManaged(true;
}