如何解决为什么 JFrame 没有注册“ESC”被按下?
在我的游戏中,我希望玩家能够按 ESC 并激活菜单。在此菜单中,他们将能够返回主屏幕。我已尝试使用 .addKeyListener()
,如下所示。我曾尝试使用 event.getKeyCode() == 27
和 event.getKeyCode() == KeyEvent.VK_ESCAPE
,但它似乎没有改变结果(JFrame 未注册“ESC”被按下。
我的代码有问题吗?或者我只是错过了一些明显的东西..
代码(如果你有答案,请参考这个):
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
public class Main {
static JFrame jframe = new JFrame();
static JLabel startingTitle = new JLabel("Welcome!");
static JPanel aiPanel = new JPanel();
static Font buttonFont = new Font("mineCrafter",Font.BOLD,20);
static JFrame gameScreen = new JFrame();
static JFrame onevonescreen = new JFrame();
static JFrame escScreen = new JFrame();
static JPanel onevonePanel = new JPanel();
static JFrame aiScreen = new JFrame();
static JPanel title = new JPanel();
static JButton onevone = new JButton("Multiplayer");
static JButton aifight = new JButton("Singleplayer");
static JButton BackToStart = new JButton("Back");
public Main(){
Font myFont = new Font("Serif",30);
startingTitle.setFont(myFont);
startingTitle.setAlignmentX(Component.CENTER_ALIGNMENT);
onevone.setAlignmentX(Component.CENTER_ALIGNMENT);
aifight.setAlignmentX(Component.CENTER_ALIGNMENT);
title.setLayout(new BoxLayout(title,BoxLayout.Y_AXIS));
title.add(Box.createRigidArea(new Dimension(0,50)));
title.add(startingTitle);
title.add(Box.createRigidArea(new Dimension(0,50)));
title.add(aifight);
title.add(Box.createRigidArea(new Dimension(0,25)));
title.addKeyListener(new MKeyListener());
title.add(onevone);
gameScreen.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
gameScreen.setLocationRelativeto(null);
gameScreen.setExtendedState(JFrame.MAXIMIZED_BOTH);
gameScreen.add(title);
gameScreen.pack();
}
static void setEscScreen(boolean on){
escScreen.setVisible(on);
}
public static void main(String[] argv) throws Exception {
SwingUtilities.invokelater(Main::new);
BackToStart.setFont(buttonFont);
BackToStart.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
aiPanel.setVisible(false);
onevonePanel.setVisible(false);
title.setVisible(true);
gameScreen.add(title);
}
});
JButton startGame = new JButton("Launch");
startGame.setFont(buttonFont);
startGame.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Started");
jframe.setVisible(false);
gameScreen.setVisible(true);
title.setVisible(true);
}
});
// Creates starting screen
onevone.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Activate 1v1");
title.setVisible(false);
onevonePanel.setVisible(true);
gameScreen.add(onevonePanel);
}
});
aifight.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Activate AI");
title.setVisible(false);
aiPanel.setVisible(true);
gameScreen.add(aiPanel);
}
});
// Creates onevonescreen
JLabel onevoneTitle = new JLabel("1v1[In Progress]");
onevonePanel.add(onevoneTitle);
onevonePanel.addKeyListener(new MKeyListener());
// Creates aiScreen
JLabel aiTitle = new JLabel("ai[In Progress]");
aiPanel.add(aiTitle);
aiPanel.addKeyListener(new MKeyListener());
//Creates escScreen
escScreen.setLayout(new GridBagLayout());
escScreen.add(BackToStart,new GridBagConstraints());
escScreen.getContentPane().setBackground(new Color(211,211,211));
escScreen.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
escScreen.setLocationRelativeto(null);
escScreen.setExtendedState(JFrame.MAXIMIZED_BOTH);
// Creates launch screen
jframe.setLayout( new GridBagLayout() );
jframe.add(startGame,new GridBagConstraints());
jframe.setSize(400,350);
jframe.setVisible(true);
}
}
class MKeyListener extends KeyAdapter {
static boolean escapedOn = false;
public void keypressed(KeyEvent event) {
char ch = event.getKeyChar();
int e = event.getKeyCode();
if (e == KeyEvent.VK_ESCAPE){
if (escapedOn == true){
System.out.println("escaped off");
Main.setEscScreen(false);
escapedOn = false;
} else if (escapedOn == false){
System.out.println("escaped on");
Main.setEscScreen(true);
escapedOn = true;
}
}
}
}
另一个我想回答的问题(但不是必须回答):我可以将菜单 JFrame 设置为稍微透明吗(以便您可以在后台看到游戏)?如果可以,您是否也可以在答案中实现它?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。