Панель инструментов не скрывается на ParticleApplication

У меня есть следующий код:

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

Меню не отображается (но пространство все еще там), но панель инструментов все еще видна.

Любые предложения?

1 ответ

Решение

Если вы запустите этот короткий тест с обычным приложением 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);
}

панель инструментов

Согласно JavaDoc для узла managed имущество:

Определяет, будет ли компоновка этого узла управляться его родителем. Если узел управляется, его родительский объект будет учитывать геометрию узла в своих собственных предпочтительных вычислениях размера и layoutBounds и будет размещать ее во время этапа компоновки сцены. Если изменяется layoutBounds управляемого узла, он автоматически запускает ретрансляцию графа сцены до ближайшего корневого макета (который обычно является корневым узлом сцены).

Это означает, что верхняя область пограничной панели сохраняет предпочтительный размер, заданный панелью инструментов (которой по умолчанию управляют), независимо от ее видимости.

Когда вы устанавливаете видимость ToolBar в false, вам также нужно освободить место, установив managed ложно:

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

РЕДАКТИРОВАТЬ

В вашем случае у вас также есть MenuBarи ToolBarmanaged свойство уже связано с его видимостью, поэтому вам нужно только установить:

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;
}
Другие вопросы по тегам