[英]My JFrame is not changing when key pressed
I have a Jframe set on a timer and im trying to change one of the pictures by pressing the down key (special code 40), yet nothing is happening. 我在计时器上设置了一个Jframe,我试图通过按下向下键(特殊代码40)来更改其中一张图片,但是什么也没发生。
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.awt.image.BufferedImage;
public class MenuScreen extends JFrame {
private static JFrame frame;
GameKeyboard GK;
boolean gamePlay = false;
boolean gameQuit = false;
boolean gameTwoPlayer = false;
String option;
//set dimension of window and buttons
public final int screenWidth = 800; // Width of window
public final int screenHeight = screenWidth / 12 * 9; // Height of window
private static Graphics gr;
//store images
private static Image background;
private static Image play;
private static Image twoPlayer;
private static Image quit;
private static Image playSelected;
private static Image twoPlayerSelected;
private static Image quitSelected;
public MenuScreen() {
frame = new JFrame();
setSize(screenWidth, screenHeight);
// frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setTitle("Space Wars Menu");
frame.setLocation(0, 0);
BufferedImage canvas=new BufferedImage(920,720,BufferedImage.TYPE_INT_ARGB);
gr=canvas.getGraphics();
JLabel label=new JLabel(new ImageIcon(canvas));
frame.add(label);
MenuKeyboard.initialise();
//load images
background = GameImage.loadImage("Images//background.jpg");
play = GameImage.loadImage("Images//play.png");
playSelected = GameImage.loadImage("Images//playSelected.png");
twoPlayer = GameImage.loadImage("Images//twoPlayer.png");
twoPlayerSelected = GameImage.loadImage("Images//twoPlayerSelected.png");
quit = GameImage.loadImage("Images//quit.png");
quitSelected = GameImage.loadImage("Images//quit.png");
//draw images
gr.drawImage(background, 0, 0, null);
gr.drawImage(playSelected, 180, -50, null);
gr.drawImage(twoPlayer, 180, 50, null);
gr.drawImage(quit, 180, 150, null);
ActionListener taskPerformer = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
doTimerAction();
}
};
Timer t = new Timer(25, taskPerformer);
t.start();
}
private static void doTimerAction() {
int specialKey = MenuKeyboard.getSpecialKey();
if (specialKey == 40) //if down pressed
{
gr.drawImage(twoPlayerSelected, 160, 150, null);
gr.drawImage(play, 160, -50, null);
}
}
}
HOWEVER, when I add extra code like: 但是,当我添加如下代码时:
if (specialKey == 40) //if down pressed
{
gr.drawImage(twoPlayerSelected, 160, 150, null);
gr.drawImage(play, 160, -50, null);
Game game = new Game();
game.start();
}
and then press down when running it it then works and send me onto my game class! 然后在运行它时按下它,然后将其发送至我的游戏课!
Any one got any suggestions? 任何人有任何建议吗?
Read the Key Bindings link that I provided to you in your previous question (and provided again here), as use of this would work best in this situation. 阅读我在上一个问题中提供给您的“ 键绑定”链接 (并在此处再次提供),因为在这种情况下使用此键效果最佳。 A Timer is for repeated actions, which is not what you're trying to do.
计时器用于重复操作,这不是您要尝试执行的操作。 You need to respond to an event , and the Key Bindings will help you do that.
您需要响应一个事件 ,按键绑定将帮助您做到这一点。
For example: 例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class MenuScreen2 extends JPanel {
private static final int PREF_W = 800;
private static final int PREF_H = (9 * PREF_W) / 12;
private JLabel label = new JLabel("", SwingConstants.CENTER);
public MenuScreen2() {
setLayout(new GridBagLayout());
add(label);
label.setFont(label.getFont().deriveFont(Font.BOLD, 50));
setBackground(Color.cyan);
// Key Bindings is done in the code below
// the down String will be used to tie the down keystroke put into the InputMap
// with the DownAction put into the ActionMap
String down = "down";
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), down);
getActionMap().put(down, new DownAction());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
// This is the Action used in our Key Bindings
private class DownAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent arg0) {
label.setText("Time To Start The Game!");
}
}
public static void main(String[] args) {
// run our Swing application in a thread-safe way
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MenuScreen2 mainPanel = new MenuScreen2();
JFrame frame = new JFrame("Menu Screen");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.