2017-07-13 4 views
0

Ich habe eine Frage über Java mit der Klasse KeyListener, die für das Abhören von Schlüsseln verwandt ist. In meiner Bewerbung zeige ich zunächst ein Einführungsvideo mit JavaFX Toolkit. Ich habe eine KeyListener für die JFXPanel für das Video verwendet, und es funktioniert gut, es ist in der Lage, die Tasten zu lesen, die ich in der Tastatur drücken, während das Video abgespielt wird. Aber das Problem ist, wenn das Video endet (entweder weil es zu Ende spielt oder weil ich es durch eine Unterbrechung eines Threads durch Drücken der "Escape" -Taste zu stoppen), dass ich versuche, eine neue KeyListener der Haupt JFrame der Anwendung hinzuzufügen und Ich kann keinen Schlüssel daraus lesen.KeyListener funktioniert nicht richtig in Java

Sie sollten auch sich fragen, warum ich eine KeyListener zum JFXPanel und dann nach dem Video hinzugefügt endet ich eine neue KeyListener an die Haupt JFrame der Anwendung hinzuzufügen, anstatt nur einer KeyListener zum JFrame von Anfang an hinzufügen. Der Grund ist, dass, wenn ich das tue, ich keine Taste während der Wiedergabe des Videos lesen kann, also schlug mir jemand vor, die KeyListener zu der JFXPanel hinzuzufügen.

Hier ist der gesamte Code meiner Anwendung:

/** 
* 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

Importe und alle Kommentare zu jeder Methode ist nicht sinnvoll für alle, dank gut eingerückt haben;) – azro

+0

@azro - nun, zumindest sollte dieser Eingang kompilieren ... und sollte leicht zu einem lauffähigen Programm führen. Ich habe schlimmer gesehen. A 100 mal schlechter. Wahrscheinlich 100 Mal in den letzten Stunden. – GhostCat

+0

@GhostCat Ich weiß, ich weiß – azro

Antwort

0

Die richtige Antwort auf diese Frage lautet:

ich die Anweisung window.requestFocus() vor der Anweisung window.addKeyListener(keyListener) und jetzt hinzugefügt wird, kann es lesen, wenn die „Flucht "Die Taste wird gedrückt, nachdem das Video abgespielt wurde.