2017-07-13 9 views
0

キーのリスニングに使用されるクラスKeyListenerに関連するJavaに関する質問があります。私のアプリケーションではまず、JavaFXツールキットを使って紹介ビデオを表示します。ビデオに使用されているJFXPanelのためにKeyListenerを設定し、正常に動作し、ビデオの再生中にキーボードで押すキーを読み取ることができます。しかし問題は、ビデオの終了時(再生が終了したため、または「エスケープ」キーを押してスレッドを中断して停止するため)、アプリケーションのメインJFrameに新しいKeyListenerを追加しようとすることです。私はそれから鍵を読み取ることができません。KeyListenerがJavaで正しく機能していない

私はJFXPanelKeyListenerを加えた後、ビデオの後、私が代わりに最初からJFrameに一つだけKeyListenerを追加するので、アプリケーションのメインJFrameに新しいKeyListenerを追加終了なぜあなたはまた、自分自身に問う必要があります。その理由は、ビデオを再生しているときにキーを読み取ることができないため、誰かが私にKeyListenerJFXPanelに追加するよう提案したからです。この質問に対する正しい答えは

/** 
* Main class of the application. 
*/ 
public class Main{ 

    // Define the variable for the window of the game. 
    public static JFrame window; 

    // Define the variable for the introductory video. 
    public static MediaPlayer video; 

    // Define the variable for a thread. 
    public static Thread thread; 

    /** 
    * Main function of the application. 
    */ 
    public static void main(String[] args){ 

    // Create a Swing thread. 
    SwingUtilities.invokeLater(new Runnable(){ 

     @Override 
     public void run(){ 

     // Prevent the JavaFX toolkit from closing. 
     Platform.setImplicitExit(false); 

     // Create the window of the game. 
     window = new JFrame(); 

     // Set the title. 
     window.setTitle("Chip"); 

     // Set the resolution as 1920 x 1280. 
     window.setSize(1926,1343); 

     // Set the location as in the middle of the screen. 
     window.setLocationRelativeTo(null); 

     // Set the operation when the window closes. 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Disable the maximization and resizable mode. 
     window.setResizable(false); 

     // Show the window. 
     window.setVisible(true); 

     // Create a key listener. 
     KeyListener keyListener = createKeyListener(); 

     // Create a JavaFX panel. 
     JFXPanel panelJavaFX = new JFXPanel(); 

     // Add the key listener to the JavaFX panel. 
     panelJavaFX.addKeyListener(keyListener); 

     // Create a JavaFX thread. 
     Platform.runLater(new Runnable(){ 

      @Override 
      public void run(){ 

      // Create a new thread. 
      thread = new Thread(new Runnable(){ 

       public void run(){ 

       try{ 

        // Show the introductory video. 
        showVideo(panelJavaFX); 

        // Pause the execution of the application for 30 seconds (duration of the introductory video). 
        Thread.sleep(30000); 

       }catch (InterruptedException interruptedException){ 

        // Stop the video if an interruption has been occurred. 
        video.stop(); 

       } 

       // Set the background image. 
       String filename = "./media/image/background.jpg"; 
       window.setContentPane(new JLabel(new ImageIcon(filename))); 

       // Show the window. 
       window.setVisible(true); 

       // Add the key listener to the window of the game. 
       window.addKeyListener(keyListener); 

       } 

      }); 

      // Start the execution of the thread. 
      thread.start(); 

      } 

     }); 

     } 

    }); 

    } 

    /** 
    * Creates a key listener. 
    * @return Key listener. 
    */ 
    public static KeyListener createKeyListener(){ 

    // Create the key listener. 
    KeyListener keyListener = new KeyListener(){ 

     // Set the behavior whenever a key is pressed. 
     @Override 
     public void keyPressed(KeyEvent keyEvent){ 

     // Check if the "Escape" key is pressed. 
     if (keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE){ 

      // Check if the introductory video it is being played. 
      if (video.getStatus().equals(Status.PLAYING)){ 

      // Make an interruption in the thread that is being executed. 
      thread.interrupt(); 

      } 

     } 

     } 

     // Set the behavior whenever a key is released. 
     @Override 
     public void keyReleased(KeyEvent keyEvent){} 

     // Set the behavior whenever a key is typed. 
     @Override 
     public void keyTyped(KeyEvent keyEvent){} 

    }; 

    // Return the key listener. 
    return keyListener; 

    } 

    /** 
    * Shows the introductory video. 
    * @param panelJavaFX JFXPanel used to display the video. 
    */ 
    public static void showVideo(JFXPanel panelJavaFX){ 

    // Set the size of the JaxaFX panel as the resolution of the introductory video (1920 x 1080). 
    panelJavaFX.setSize(1920,1080); 

    // Set the location of the JavaFX panel as in the middle of the window of the game. 
    int coordinateX = (window.getWidth() - panelJavaFX.getWidth() - window.getInsets().left - window.getInsets().right)/2; 
    int coordinateY = (window.getHeight() - panelJavaFX.getHeight() - window.getInsets().top - window.getInsets().bottom)/2; 
    panelJavaFX.setLocation(coordinateX,coordinateY); 

    // Define the video file. 
    String filename = "./media/video/introduction.mp4"; 
    video = new MediaPlayer(new Media(new File(filename).toURI().toString())); 

    // Add the video to the JavaFX panel. 
    panelJavaFX.setScene(new Scene(new Group(new MediaView(video)))); 

    // Add the JavaFX panel to the window of the game. 
    window.getContentPane().setLayout(null); 
    window.add(panelJavaFX); 

    // Play the video. 
    video.setAutoPlay(true); 

    } 

} 
+0

それぞれのメソッドのすべてのコメントは役に立ちません。おかげで、よくインデントされました;) – azro

+0

@azro - 少なくともこの入力はコンパイルする必要があり、実行可能なプログラムに簡単につながるはずです。私は悪化を見た。 100倍悪いおそらく最後の時間に100回。 – GhostCat

+0

@GhostCat私は知っている知っている – azro

答えて

0

:ここ

は自分のアプリケーションのすべてのコードである

私は命令window.addKeyListener(keyListener)前に命令window.requestFocus()を追加し、今ではとき「エスケープ読むことができますビデオが再生された後、キーが押されます。

関連する問題