Восстановить фокус javafx - PullRequest
0 голосов
/ 11 марта 2019

У меня есть приложение, которое работает в фоновом режиме.В jkeymaster я зарегистрировал глобальную горячую клавишу для запуска, хотя мое приложение не является активным.Это работает.Теперь я хочу снова переключить фоновое приложение на передний план.Пробовал с этим кодом:

import com.tulskiy.keymaster.common.HotKey;
import com.tulskiy.keymaster.common.HotKeyListener;
import com.tulskiy.keymaster.common.Provider;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class TestClientNotWorking extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws AWTException {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Btn said 'Hello World!'");
            }
        });

        HBox root = new HBox(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
        primaryStage.requestFocus();

        Provider provider = Provider.getCurrentProvider(false);
        provider.register(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 
            InputEvent.ALT_MASK | InputEvent.SHIFT_MASK), 
            new HotKeyListener() {
            @Override
            public void onHotKey(HotKey hotKey) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Recievd");
                        primaryStage.toFront();
                        btn.requestFocus();
                    }
                });
            }
        });
    }
}

Что происходит: моя сцена возвращается на передний план, но фокус все еще остается в приложении, где он был раньше, и не переносится на мой primaryStage.Можете ли вы помочь мне, как я мог получить это?

Заранее спасибо

1 Ответ

0 голосов
/ 16 марта 2019

Я скомпилировал и запустил код. Насколько я понимаю, ваши ожидания:

  • Запустить приложение, зарегистрировать ключ подключения
  • свернуть окно JFX
  • комбинация нажатий клавиш (alt shift в вашем случае)
  • результат : окно jfx находится в состоянии переднего плана, кнопка «Hello World» находится в фокусе

btn.requestFocus () работает правильно на моей ОС без каких-либо изменений, но я думаю, вам нужно попробовать setIconified \ setMaximized вместо primaryStage.toFront (); Я немного изменил ваш код, пожалуйста, попробуйте и дайте нам знать, если он работает, как вы хотите.

public class TestClientNotWorking extends Application {

    private final Provider provider = Provider.getCurrentProvider(false);

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

    @Override
    public void start(final Stage primaryStage) throws AWTException {
        final Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(final ActionEvent event) {
                System.out.println("Btn said 'Hello World!'");
            }
        });

        final HBox root = new HBox(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
        root.requestFocus();// remove focus from btn

        final KeyStroke stroke = KeyStroke.getKeyStroke("ctrl SPACE");// stroke = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK | InputEvent.ALT_MASK);
        provider.register(stroke, new HotKeyListener() {
            @Override
            public void onHotKey(final HotKey hotKey) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Recievd");
                        primaryStage.setIconified(false); // primaryStage.toFront();
                        btn.requestFocus(); // set focus on btn
                    }
                });
            }
        });
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        provider.stop();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...