简体   繁体   English

KeyListener在Java中无法正常工作

[英]KeyListener not working properly in Java

I have a question about Java related with the class KeyListener which is used for the listening of keys. 我有一个关于Java的问题,该类与用于侦听键的KeyListener有关。 In my application firstly I display an introductory video with JavaFX toolkit. 首先,在我的应用程序中,使用JavaFX工具包显示一个介绍性视频。 I set a KeyListener for the JFXPanel used for the video, and it works fine, it is able to read the keys that I press in the keyboard while the video is being played. 我为用于视频的JFXPanel设置了一个KeyListener ,它工作正常,它能够读取播放视频时在键盘上按的键。 But the problem is when the video ends (either because it finishes playing or because I stop it by making an interruption to a thread pressing the "Escape" key), that I try to add a new KeyListener to the main JFrame of the application and I am not able to read any key from it. 但是问题是视频结束时(要么是因为它完成了播放,要么是因为我通过中断按“ Escape”键的线程来停止了它),所以我尝试将新的KeyListener添加到应用程序的主JFrame中,我无法从中读取任何密钥。

You should also ask yourself why I added a KeyListener to the JFXPanel and then after the video ends I add a new KeyListener to the main JFrame of the application, instead of adding only one KeyListener to the JFrame from the start. 您还应该问自己,为什么我向JFXPanel添加了一个KeyListener ,然后在视频结束后向应用程序的主JFrame添加了一个新的KeyListener ,而不是从一开始就仅向JFrame添加了一个KeyListener The reason is that if I do that, then I am not able to read any key while the video is being played, so someone suggested me to adding the KeyListener to the JFXPanel . 原因是,如果这样做,则在播放视频时无法读取任何键,因此有人建议我将KeyListener添加到JFXPanel

Here is all the code of my application: 这是我的应用程序的所有代码:

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

  }

}

The correct answer to this question is: 这个问题的正确答案是:

I added the instruction window.requestFocus() before the instruction window.addKeyListener(keyListener) and now it can read when the "Escape" key is pressed after the video has been played. 我在指令window.addKeyListener(keyListener) window.requestFocus()之前添加了指令window.requestFocus() ,现在在播放视频后按下“退出”键时它可以读取。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM