[英]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.