2017-05-22 6 views
2

ホットキー(Alt + Shift + V)を押すと、アプリケーションにフォーカスが戻らない。 グローバルキーボードリスナーとしてJnativeHookを使用します。私はステージまたはノードrequestFocus()toFront()のいずれかに追加しようとしましたが、それは助けになりませんでした。同じ状況でswingを使用した場合。 swingjavFXに設定されたモダリティも試してみましたが役に立たなかった。私は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) {} 
     }); 
    } 
} 
+0

これはどれですか? – JCOC611

答えて

0

あなたはアプリの中でAPIを使用しなければならないと思っています。アプリの各部分では、必要なインターフェースを書く必要があります。 についてswingについては、swingのダイアログウィンドウを使用し、JFrameを作成してJPanelを追加することもできます。

+0

私はあなたがアプリケーションの中でAPIを使用しなければならないと思うし、あなたが望むインターフェイスを書くために必要なアプリケーションの各部分で。 これはどのようにフォーカスを受け取るのに役立ちますか? – Igor

+0

スイングアプリのダイアログは役に立ちません。 – Igor

関連する問題