Панель инструментов не скрывается на 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
и 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;
}