簡體   English   中英

KeyListener在Java中無法正常工作

[英]KeyListener not working properly in Java

我有一個關於Java的問題,該類與用於偵聽鍵的KeyListener有關。 首先,在我的應用程序中,使用JavaFX工具包顯示一個介紹性視頻。 我為用於視頻的JFXPanel設置了一個KeyListener ,它工作正常,它能夠讀取播放視頻時在鍵盤上按的鍵。 但是問題是視頻結束時(要么是因為它完成了播放,要么是因為我通過中斷按“ Escape”鍵的線程來停止了它),所以我嘗試將新的KeyListener添加到應用程序的主JFrame中,我無法從中讀取任何密鑰。

您還應該問自己,為什么我向JFXPanel添加了一個KeyListener ,然后在視頻結束后向應用程序的主JFrame添加了一個新的KeyListener ,而不是從一開始就僅向JFrame添加了一個KeyListener 原因是,如果這樣做,則在播放視頻時無法讀取任何鍵,因此有人建議我將KeyListener添加到JFXPanel

這是我的應用程序的所有代碼:

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

  }

}

這個問題的正確答案是:

我在指令window.addKeyListener(keyListener) window.requestFocus()之前添加了指令window.requestFocus() ,現在在播放視頻后按下“退出”鍵時它可以讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM