我在计时器上设置了一个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);
}
}
}
但是,当我添加额外的代码时:
if (specialKey == 40) //if down pressed
{
gr.drawImage(twoPlayerSelected, 160, 150, null);
gr.drawImage(play, 160, -50, null);
Game game = new Game();
game.start();
}
然后按下它,然后运行它然后工作并将我发送到我的游戏课程!
有人有任何建议吗?
答案 0 :(得分:1)
阅读我在上一个问题中提供给您的Key Bindings link(此处再次提供),因为在这种情况下使用此功能最有效。计时器用于重复操作,这不是您尝试做的事情。您需要回复 事件 ,而Key Bindings将帮助您做到这一点。
例如:
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);
}
});
}
}