重新获得JavaFX焦点

时间:2019-03-11 07:50:19

标签: javafx focus

我有一个在后台运行的应用程序。尽管我的应用程序不是活动的,但我已经使用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 :(得分:0)

我编译并运行了代码。据我了解,您的期望是:

  • 启动应用程序,注册密钥挂钩
  • 最小化jfx窗口
  • 按组合键(在您的情况下为alt移位空间)
  • 结果: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();
    }
}