0

我有以下代码:

@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);
  }
}

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

有什么建议吗?

4

1 回答 1

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

工具栏

根据节点managed属性的JavaDoc:

定义此节点的布局是否将由其父节点管理。如果节点是托管的,它的父节点会将节点的几何体考虑到它自己的首选大小和 layoutBounds 计算中,并将在场景的布局过程中对其进行布局。如果托管节点的 layoutBounds 发生变化,它将自动触发重新布局场景图到最近的布局根(通常是场景的根节点)。

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

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

@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;
}
于 2016-04-28T20:52:10.987 回答