Сцена с модальностью скрыть кнопку максимизации - PullRequest
1 голос
/ 30 сентября 2019

Когда я устанавливаю модальность сцены, она скрывает кнопку максимизации

Stage stage = new Stage();
stage.setScene(new Scene((Parent) controller.getViewNode()));
stage.initStyle(StageStyle.DECORATED);

stage.setResizable(true);
stage.setIconified(false);

stage.initModality(Modality.APPLICATION_MODAL);
stage.initOwner(window);

Поэтому я хотел, чтобы сцена была модальной, но также показываю кнопку максимизации, чего не происходит. Кстати, я использую Ubuntu. Я уже сделал поиск, но я только нашел, как удалить кнопку максимизации

1 Ответ

0 голосов
/ 27 октября 2019

То же самое происходит со мной. Если я попытаюсь максимизировать, используя

stage.setMaximized(true);

, это не сработает, и кнопка максимизации не отображается. Я исследую это, но ответа нет вообще. Это первый подобный вопрос, который я нашел здесь. Я использую:

  • ОС: GNU / Linux
  • Дистрибутив: Manjaro
  • Linux Core: 5.3.6-1
  • DE:Gnome.
  • Версия Java: OpenJDK 12.0.1
  • Версия JavaFX: OpenJFX 12.0.1 (сборка глюона).

ОБНОВЛЕНИЕ: Официальная документация гласит:

Обратите внимание, что показ модального этапа не обязательно блокирует вызывающего.

Итак, я решил решить эту проблему с помощью EventHandler. Я создал вспомогательный класс, который позаботится об этом.

import javafx.event.Event;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

/**
 * This is a utility class to create a Widow Event handler
 * in such way that when a child window shows, a parent (owner)
 * stage get locked; and when the child window hides, the parent
 * stage get unlocked.
 *
 * @author David Vidal
 * @version 1.0
 * @since 1.0
 */
public final class WindowsModality {
    /*=================*
     * Private fields. *
     *=================*/
    /**
     * The parent stage.
     */
    private final Stage owner;

    /*===============*
     * Constructors. *
     *===============*/

    /**
     * Initialize an instance with given parameters.
     *
     * @param owner parent stage.
     * @param child child stage.
     */
    public WindowsModality(Stage owner, Stage child) {
        this.owner = owner;
        child.addEventHandler(WindowEvent.WINDOW_HIDDEN, this::childHidden);
        child.addEventHandler(WindowEvent.WINDOW_SHOWN, this::childShown);
    }

    /*==================*
     * Implementations. *
     *==================*/

    /**
     * Implementation of functional interface EventHandler,
     * used to know when the child window is closed/hidden.
     *
     * @param event from {@link javafx.event.EventHandler#handle(Event)}
     */
    private void childHidden(WindowEvent event) {
        if (!event.isConsumed()) {
            owner.getScene().getRoot().setDisable(false);
        }
    }

    /**
     * Implementation of functional interface EventHandler,
     * used to know when the child window is shown.
     *
     * @param event from {@link javafx.event.EventHandler#handle(Event)}
     */
    private void childShown(WindowEvent event) {
        if (!event.isConsumed()) {
            owner.getScene().getRoot().setDisable(true);
        }
    }
}

И затем я просто добавил следующий код:

public void showAnotherStage(){
    //(Create and setup the new stage and scene)

    new WindowModality(primaryStage, newStage);
    newStage.show();

    //Do something else.
}

Это было мое решение, проверено и работает нормально,Когда отображается дочернее окно (newStage), владелец (primaryStage) отключается, поэтому, несмотря на то, что пользователь может активировать окно primaryStage, пользователь не может взаимодействовать с его узлами.

Я надеюсь, что это то, чем вы былинаходясь в поиске. Привет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...