Java 需要帮助将我的按键侦听器从main中取出吗

Java 需要帮助将我的按键侦听器从main中取出吗,java,keypress,Java,Keypress,我已经开始创建一个可以自由移动的游戏。你们用键盘移动,我让它工作,但我想做的就是把它从main中取出,这样我就可以调用不同类的乘法。我试着把它放在一个公共的静态空间中,并从main调用该方法,但它不起作用。 下面提供了我的代码。我已经在这上面呆了很长时间了 我在相框中有一张图片,使其可见。图片名为1 import java.awt.event.KeyEvent; import java.util.Timer; import java.util.TimerTask; import javax.sw

我已经开始创建一个可以自由移动的游戏。你们用键盘移动,我让它工作,但我想做的就是把它从main中取出,这样我就可以调用不同类的乘法。我试着把它放在一个公共的静态空间中,并从main调用该方法,但它不起作用。 下面提供了我的代码。我已经在这上面呆了很长时间了

我在相框中有一张图片,使其可见。图片名为1

import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
public class StartGame {
    public static void main(String[] argv) throws Exception {
        JFrame MainFrame = new JFrame();
        MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainFrame.setSize(1210, 700);
        MainFrame.setLocation(new java.awt.Point(150, 30));
        MainFrame.setLayout(null);
        MainFrame.setFocusable(true);
        MainFrame.setFocusTraversalKeysEnabled(true);
        MainFrame.setIconImage(new ImageIcon("images\\sword.png").getImage());
        JLabel thing = new JLabel();
        thing.setIcon(new ImageIcon("image\\1.gif"));
        thing.setBounds(300, 300, thing.getPreferredSize().width, thing.getPreferredSize().height);

        MainFrame.addKeyListener(new java.awt.event.KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
                    if (0 < thing.getY()) { 
                        thing.setLocation(thing.getX(), thing.getY() - 10);
                    }
                }
                if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S) {
                    if (thing.getY() < 570) {
                        thing.setLocation(thing.getX(), thing.getY() + 10);
                    }
                }
                if (e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D) {
                    if (thing.getX() < 1110) {
                        thing.setLocation(thing.getX()+ 10, thing.getY());
                    }
                }
                if (e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A) {        
                    if (0 < thing.getX()) {
                        thing.setLocation(thing.getX() - 10, thing.getY());
                    }
                }

            }

            public void keyTyped(KeyEvent e) {

            }

            public void keyReleased(KeyEvent e) {


            }
        });

        MainFrame.add(thing);
        MainFrame.setVisible(true);
    }
}
import java.awt.event.KeyEvent;
导入java.util.Timer;
导入java.util.TimerTask;
导入javax.swing.*;
公共类StartName{
公共静态void main(字符串[]argv)引发异常{
JFrame MainFrame=新JFrame();
MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
大型机。设置大小(1210700);
setLocation(新java.awt.Point(150,30));
MainFrame.setLayout(空);
MainFrame.setFocusable(true);
MainFrame.setFocusTraversalKeysEnabled(true);
MainFrame.setIconImage(新的图像图标(“images\\swarm.png”).getImage();
JLabel thing=新JLabel();
设置图标(新的图像图标(“image\\1.gif”);
setBounds(300300,thing.getPreferredSize().width,thing.getPreferredSize().height);
MainFrame.addKeyListener(新的java.awt.event.KeyListener(){
按下公共无效键(按键事件e){
如果(e.getKeyCode()==KeyEvent.VK_向上| | e.getKeyCode()==KeyEvent.VK_W){
如果(0
不要使用
键侦听器,请使用。使用键绑定API将允许您在“窗口”级别而不是组件级别响应键事件(如果需要)

例如

import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;

public class StartGame {

    public static void main(String[] argv) throws Exception {
        JFrame mainFrame = new JFrame();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(1210, 700);
        mainFrame.setLocation(new java.awt.Point(150, 30));
        mainFrame.setLayout(null);
        mainFrame.setFocusable(true);
        mainFrame.setFocusTraversalKeysEnabled(true);
        mainFrame.setIconImage(new ImageIcon("images\\sword.png").getImage());
        JLabel thing = new JLabel("X");
        //thing.setIcon(new ImageIcon("image\\1.gif"));
        thing.setBounds(300, 300, thing.getPreferredSize().width, thing.getPreferredSize().height);

        InputMap inputMap = thing.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = thing.getActionMap();

        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "move.up");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), "move.up");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "move.down");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), "move.down");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "move.left");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "move.left");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "move.right");
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "move.right");

        actionMap.put("move.up", new ThingAction(thing, new Point(0, -1)));
        actionMap.put("move.down", new ThingAction(thing, new Point(0, 1)));
        actionMap.put("move.left", new ThingAction(thing, new Point(-1, 0)));
        actionMap.put("move.right", new ThingAction(thing, new Point(1, 0)));

        mainFrame.add(thing);
        mainFrame.setVisible(true);
    }

    public static class ThingAction extends AbstractAction {
        private JLabel thing;
        private Point delta;

        public ThingAction(JLabel thing, Point delta) {
            this.thing = thing;
            this.delta = delta;
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            thing.setLocation(thing.getX() + delta.x, thing.getY() + delta.y);
        }
    }
}
这是一个非常基本的示例,但它演示了两个关键点:

  • 可以将多个键指定给单个操作
  • 您可以将输入(即键盘)与实现分离,这意味着您可以使用相同的基本
    操作
    来处理鼠标输入或操纵杆输入

  • 首先,您需要使用游戏循环模式。 游戏循环模式是按特定顺序处理游戏事件的循环。首先处理输入、更新对象,最后渲染屏幕。 此图像是该渲染的一个示例:

    如果您在项目开始时没有遵循这种模式,那么在项目开始时,您将发现更多的困难需要处理

    使用此模式,您可以使用调用输入句柄类的方法更新创建类游戏。这样,您可以将输入句柄移动到可以创建的另一个类。例如:

    class Game {
    
        void update(){
            InputManager.handleInput();
            updateObjects();
            render();
    
        }
    }
    
    
    class InputManager {
    
        void handleInput(){
            //do whatever you like
    
        }
    
    }
    

    请阅读此博客以了解更多信息:

    首先,不要使用
    keylister
    ,请使用。使用键绑定API将允许您在“窗口”级别而不是组件级别(如果您愿意)响应键事件。当我使用它时,它不会显示应该生成的帧。所以我无法测试这是否有效。