按下键时我的JFrame没有改变

时间:2014-04-01 20:59:58

标签: java input timer keyboard jframe

我在计时器上设置了一个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();

    }

然后按下它,然后运行它然后工作并将我发送到我的游戏课程!

有人有任何建议吗?

1 个答案:

答案 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);
         }
      });
   }
}