当按下键JFrame的我是不会改变(My JFrame is not changing when k

2019-10-29 13:39发布

我有一个JFrame上的计时器和IM试图通过按向下键(特殊代码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();

    }

然后按下运行它时它即可工作,并送我到我的游戏类!

任何一个有什么建议吗?

Answer 1:

阅读键绑定的链接 ,我在以前的问题提供给你(在这里再次提供),因为使用这样的工作最好在这种情况下。 计时器重复的动作,这是你想要做什么。 你需要对事件作出响应,密钥绑定将帮助你做到这一点。

例如:

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


文章来源: My JFrame is not changing when key pressed