Запрос фокуса на этапе JavaFX не меняет заголовок строки меню MacOS в верхнем левом углу. - PullRequest
0 голосов
/ 25 января 2019

Когда я пытаюсь запросить фокус (у меня MacOS Mojave 10.14.2), когда пользователь нажимает кнопку «показать» в меню иконки в трее, это не меняет строку меню в верхнем левом углу (например,Chrome -> Java), но, по крайней мере, это приносит вперед.Он не отображается вообще в полноэкранном приложении (например, если щелкнуть значок в области уведомлений в Sublime Text в полноэкранном режиме) и вместо этого показывает его в главном пространстве рабочего стола, не переходя к нему.


Пример строки меню:

About to show window должен стать this is what should happen, но вместо этого fail: it brings to top but doesn't actually gain focus

Полноэкранный пример:

About to show window when in a fullscreen app При нажатии на «Показать» ...

Nothing happens?!! Казалось бы, ничего не происходит!Он открывается без фокусировки или , появляющихся сверху и вместо основного пространства рабочего стола.

Я пытался сделать сначала комбинацию либо toFront() или requestFocus(), либо просто один или другой, но, похоже, это не сработало.

У кого-нибудь естькакие-либо исправления / обходные пути к этой проблеме?

Вот простое приложение, использованное выше, чтобы продемонстрировать проблему:

package me.matetoes.dockvisibility;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;

public class DockVisibilityTester extends Application {

    public javafx.scene.control.Button hideButton;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        hideButton = new javafx.scene.control.Button("Hide");
        hideButton.setOnAction(e -> handleHide());
        Scene scene = new Scene(hideButton, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Testing");
        Platform.setImplicitExit(false);
        createTrayIcon(primaryStage);
        primaryStage.show();
    }

    private void createTrayIcon(final Stage stage) {
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray(); // get the SystemTray instance

            Image icon = null;
            try { // load an image
                URL url = new URL("http://www.digitalphotoartistry.com/rose1.jpg");
                icon = ImageIO.read(url);
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            stage.setOnCloseRequest(e -> hide(stage)); //hide instead of close

            // to be added on "show" MenuItem and trayIcon itself
            ActionListener showListener = e -> show(stage);

            PopupMenu popup = new PopupMenu(); // create a popup menu

            MenuItem showItem = new MenuItem("Show");
            showItem.addActionListener(showListener);

            MenuItem closeItem = new MenuItem("Close");
            closeItem.addActionListener(e -> System.exit(0));

            popup.add(showItem);
            popup.addSeparator();
            popup.add(closeItem);

            assert icon != null;
            TrayIcon trayIcon = new TrayIcon(icon, "Test", popup); // construct a TrayIcon
            trayIcon.setImageAutoSize(true);
            trayIcon.addActionListener(showListener);

            try { // add the tray image
                tray.add(trayIcon);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    }

    private void hide(final Stage stage) {
        Platform.runLater(() -> {
            if (SystemTray.isSupported()) {
                stage.hide();
            } else {
                System.exit(0);
            }
        });
    }

    private void show(final Stage stage) {
        Platform.runLater(() -> {
            stage.show();

            // doesn't work!
            stage.requestFocus();
            stage.toFront();
        });
    }

    public void handleHide() {
        Stage stage = (Stage) hideButton.getScene().getWindow();
        hide(stage);
    }
}

Спасибо!:)

1 Ответ

0 голосов
/ 25 января 2019

Вы можете попробовать использовать useSystemMenuBar ()

Что-то вроде

MenuBar mnuBar;
mnuBar.useSystemMenuBar();
...