ホットキー(Alt + Shift + V)を押すと、アプリケーションにフォーカスが戻らない。 グローバルキーボードリスナーとしてJnativeHookを使用します。私はステージまたはノードrequestFocus()
とtoFront()
のいずれかに追加しようとしましたが、それは助けになりませんでした。同じ状況でswing
を使用した場合。 swing
とjavFX
に設定されたモダリティも試してみましたが役に立たなかった。私はjava.awt.Robot
を追加するオプションがありますが、これは良いアイデアではないかと思います。 ここにコード例を示します。ホットキーを押したときにJavaFXアプリケーションがフォーカスを受け取れない
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import org.jnativehook.GlobalScreen;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ShowStageTest extends Application{
private static Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());
private static final int WIDTH = 300;
private static final int HEIGHT = 400;
public static void main(String[] args) {
logger.setLevel(Level.WARNING);
Application.launch(ShowStageTest.class);
}
@Override
public void start(Stage primaryStage) throws Exception {
Platform.setImplicitExit(false);
primaryStage.setAlwaysOnTop(true);
primaryStage.initStyle(StageStyle.UNDECORATED);
primaryStage.focusedProperty().addListener((ov, t, t1) -> {
if (t) {
primaryStage.hide();
}
});
ListView<String> itemList = new ListView<>();
itemList.setPrefSize(WIDTH, HEIGHT - HEIGHT/10);
itemList.setFixedCellSize(HEIGHT/10);
TextField textField = new TextField();
textField.setPrefSize(WIDTH, HEIGHT/10);
textField.setOnKeyPressed(ke -> {
if (ke.getCode().equals(KeyCode.ENTER)) {
itemList.getItems().add(0, textField.getText());
textField.setText("");
}
});
VBox box = new VBox(textField, itemList);
box.setPrefSize(WIDTH, HEIGHT);
Scene scene = new Scene(box, WIDTH, HEIGHT);
primaryStage.setScene(scene);
GlobalScreen.registerNativeHook();
GlobalScreen.addNativeKeyListener(new NativeKeyListener() {
@Override
public void nativeKeyPressed(NativeKeyEvent e) {
boolean isAltPressed = (e.getModifiers() & NativeKeyEvent.ALT_MASK) != 0;
boolean isShiftPressed = (e.getModifiers() & NativeKeyEvent.SHIFT_MASK) != 0;
if (e.getKeyCode() == NativeKeyEvent.VC_V && isShiftPressed && isAltPressed) {
Platform.runLater(() -> {
Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
primaryStage.setX(mouseLocation.getX());
primaryStage.setY(mouseLocation.getY());
primaryStage.show();
primaryStage.toFront();
});
}
}
@Override
public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent) {}
@Override
public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent) {}
});
}
}
これはどれですか? – JCOC611