Keylistener 和 actionlistener 在调用 main 时不起作用。

Keylistener and actionlistener does not work, when calling it into main.

我正在尝试制作一个小游戏,您可以在其中四处移动。我写了一个代码,它确实有效。但是当我试图缩短我的代码并让它看起来更好时,我偶然发现了一个我无法自己解决的错误。

主要:

    package eksamenstest;

import javax.swing.JFrame;

public class Eksamenstest extends JFrame {

    public Eksamenstest() throws InterruptedException
    {
     JFrame SOJ = new JFrame("Sword Of Justice");
     SOJ.pack(); 
     SOJ.setSize(1000,700);
     SOJ.setVisible(true);
     SOJ.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     SOJ.add(new Grafik());
     }

    public static void main(String[] args) throws InterruptedException 
    {
        new Eksamenstest();
        new Musik();
        new SpillerOne();
    }
}

图形:

package eksamenstest;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class Grafik extends JPanel
{
    int Menu = 1;
    int Player1Liv = 3;
    int Player2Liv = 3;
    int DødP1 = 1;
    int DødP2 = 1;
    int WeaponON2;
    int WeaponON1;
    int Skjold;
    int Skjold1;
    int x = 100;
    int y = 360;
    int x_1 = 820;
    int y_1 = 360;

    public Grafik(){}    

     public void paint(Graphics g)
     {   
                                    //Grafikken af banen

        Image Bane2 = Toolkit.getDefaultToolkit().getImage("Bane2.png");
        g.drawImage(Bane2, 0, 0, 1000, 800, this);

        Image Plank = Toolkit.getDefaultToolkit().getImage("Plank.jpg");
        g.drawImage(Plank, 100, 500, 800, 10, this);

        Image lava = Toolkit.getDefaultToolkit().getImage("lava.png");
        g.drawImage(lava, 0, 520, 1000, 260, this);

    if(Menu == 1)
        {
        Image Menu2 = Toolkit.getDefaultToolkit().getImage("Menu.png");
        g.drawImage(Menu2, 100, -30, 900, 700, this);
        }

     //Player 1 - Grafikken der viser hvordan spilleren står. 

                        if(WeaponON1 == 0){
                        Image PlayerStå = Toolkit.getDefaultToolkit().getImage("Stå.png");
                        g.drawImage(PlayerStå, x, y, 80, 140, this);
                        }

                        if(WeaponON1 == 1){
                        Image PlayerSværdOP = Toolkit.getDefaultToolkit().getImage("OP.png");
                        g.drawImage(PlayerSværdOP, x, y, 80, 140, this);
                        }

                        if(WeaponON1 == 2){
                        Image PlayerSværdFrem = Toolkit.getDefaultToolkit().getImage("Frem.png");
                        g.drawImage(PlayerSværdFrem, x, y, 80, 140, this);
                        }
                        if(Skjold == 1){
                        Image Player1Skjold = Toolkit.getDefaultToolkit().getImage("Player1Skjold.png");
                        g.drawImage(Player1Skjold, x, y, 80, 140, this);
                        }
                        if(Player1Liv == 0){
                        Image DødP = Toolkit.getDefaultToolkit().getImage("DødP.png");
                        g.drawImage(DødP, x, y, 80, 140, this);
                        }
                        if(Player2Liv == 0){
                        Image Jubel = Toolkit.getDefaultToolkit().getImage("Jubel.png");
                        g.drawImage(Jubel, x, y, 80, 140, this);
                        }


                        //Player 2 - Grafikken der viser hvordan spilleren står. 

                        if(WeaponON2 == 0){
                        Image PlayerStå1 = Toolkit.getDefaultToolkit().getImage("Stå1.png");
                        g.drawImage(PlayerStå1, x_1, y_1, 80, 140, this);
                        }
                        if(WeaponON2 == 1){
                        Image PlayerSværdOP1 = Toolkit.getDefaultToolkit().getImage("OP1.png");
                        g.drawImage(PlayerSværdOP1, x_1, y_1, 80, 140, this);
                        }
                        if(WeaponON2 == 2){
                        Image PlayerSværdFrem1 = Toolkit.getDefaultToolkit().getImage("Frem1.png");
                        g.drawImage(PlayerSværdFrem1, x_1, y_1, 80, 140, this);
                        }
                        if(Skjold1 == 1){
                        Image Player2Skjold = Toolkit.getDefaultToolkit().getImage("Player2Skjold.png");
                        g.drawImage(Player2Skjold, x_1, y_1, 80, 140, this);
                        }
                        if(Player2Liv == 0){
                        Image DødPA = Toolkit.getDefaultToolkit().getImage("DødP.png");
                        g.drawImage(DødPA, x_1, y_1, 80, 140, this);
                        }
                        if(Player1Liv == 0){
                        Image Jubel = Toolkit.getDefaultToolkit().getImage("Jubel.png");
                        g.drawImage(Jubel, x_1, y_1, 80, 140, this);
                        }



                     //Health Bars / Stamina / Navne / Win

                             //Player 1

Image PlayerNavn = Toolkit.getDefaultToolkit().getImage("Player1Navn.png");
g.drawImage(PlayerNavn, 30, 50, 70, 30, this);
      if(Player1Liv == 3){
Image Liv100B = Toolkit.getDefaultToolkit().getImage("Liv100B.png");
g.drawImage(Liv100B, 30, 80, 120, 40, this);
    }
    if(Player1Liv == 2){
Image Liv75B = Toolkit.getDefaultToolkit().getImage("Liv75B.png");
g.drawImage(Liv75B, 30, 80, 120, 40, this);
    }
    if(Player1Liv == 1){
Image Liv50B = Toolkit.getDefaultToolkit().getImage("Liv25B.png");
g.drawImage(Liv50B, 30, 80, 120, 40, this);
    }
    if(Player1Liv == 0){
Image Liv0B = Toolkit.getDefaultToolkit().getImage("Liv0B.png");
g.drawImage(Liv0B, 30, 80, 120, 40, this);
DødP1 = 0;
Image Player2Win = Toolkit.getDefaultToolkit().getImage("Player2Wins.png");
g.drawImage(Player2Win, 350, 80, 350, 110, this);
    }

                             // Player 2

    Image PlayerNavn1 = Toolkit.getDefaultToolkit().getImage("Player2Navn.png");
g.drawImage(PlayerNavn1, 900, 50, 70, 30,this);
    if(Player2Liv == 3){
Image Liv100R = Toolkit.getDefaultToolkit().getImage("Liv100R.png");
g.drawImage(Liv100R, 850, 80, 120, 40,  this);
    }
    if(Player2Liv == 2){
Image Liv75R = Toolkit.getDefaultToolkit().getImage("Liv75R.png");
g.drawImage(Liv75R, 850, 80, 120, 40, this);
    }
    if(Player2Liv == 1){
Image Liv50R = Toolkit.getDefaultToolkit().getImage("Liv25R.png");
g.drawImage(Liv50R, 850, 80, 120, 40,  this);
    }
    if(Player2Liv == 0){
Image Liv0R = Toolkit.getDefaultToolkit().getImage("Liv0R.png");
g.drawImage(Liv0R, 850, 80, 120, 40,  this);
DødP2 = 0;
Image Player1Win = Toolkit.getDefaultToolkit().getImage("Player1Wins.png");
g.drawImage(Player1Win, 350, 80, 350, 110,  this);
    }
    }
}

球员运动

    package eksamenstest;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JFrame;

    public class SpillerOne extends JFrame implements ActionListener, KeyListener {

        int x = 100;
        int y = 360;
        int xHøjre;
        int xVenstre;
        int DødP1;
        int Player1Liv;
        int iLava;
        int x_1;
        int Player2Liv;
        int Skjold1;
        int WeaponON1;
        int Menu = 1;
        int SværdTid;
        int Sværd;
        int Skjold;


       public SpillerOne()
       {
         addKeyListener(this);
         setFocusable(true);
         setFocusTraversalKeysEnabled(false);
       }


           @Override
        public void actionPerformed(ActionEvent e) 
        {
            PlayerOneMove();
            repaint();
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
        int c = e.getKeyCode();   

                    //Menu
        if(c == KeyEvent.VK_O){
           Menu = 1;
           }
           if(c == KeyEvent.VK_P){
           Menu = 0;
           }


                // Player

                if(DødP1 == 1){

           if(c == KeyEvent.VK_A){
               xVenstre = 1;
               WeaponON1 = 0;
               Sværd = 0;
           }

           if(c == KeyEvent.VK_D){
               xHøjre = 1;
               WeaponON1 = 0;
           }

           if(WeaponON1 == 1){ 
               if(SværdTid < 3){
           if(c == KeyEvent.VK_W){
           WeaponON1 = 2;
           SværdTid++;
           }
               }
           }

           if(c == KeyEvent.VK_S){
           WeaponON1 = 1;
           Sværd = 1;
           }

           if(c == KeyEvent.VK_Q){
           Skjold = 1;
           SværdTid++;
           }
           }

           if(c == KeyEvent.VK_E){
           SværdTid--;
           WeaponON1 = 0;
           }

        }

        @Override
        public void keyReleased(KeyEvent e) 
        {
             int c = e.getKeyCode();

                    // Spiller 1

           if(c == KeyEvent.VK_A){
               xVenstre = 0;
           }

           if(c == KeyEvent.VK_D){
               xHøjre = 0;
           }

           if(c == KeyEvent.VK_Q){
           Skjold = 0;
           SværdTid = SværdTid;
           }

           if(c == KeyEvent.VK_W){
             if(Sværd == 1)
               WeaponON1 = 1;
           }


           if(c == KeyEvent.VK_E){
           SværdTid = SværdTid;
           WeaponON1 = 0;
           }
        }


       public void PlayerOneMove()
       {
             // Spiller et Bevægelse

        x = x + xHøjre; //Højre
        x = x - xVenstre; //Venstre



        if(WeaponON1 == 2){ //Tjekker om spilleren har våbnet fremme og hvis ja, så tjekker den om modspilleren har skjold på, hvis ikke, mister person 2 liv.
        if(Skjold1 == 0){ 
         if(x > x_1-80 && x < x_1 + 80){
        x = 100;
        x_1 = 820;
        Player2Liv--;
         }
        }

         if(WeaponON1 == 2){
        if(Skjold1 == 1){
         if(x > x_1-80 && x < x_1 + 80){
        x_1 = x_1 + 60;
         }
        }
    }

    }   



                        // Falder ned i lava

if(x < 100 && 100 > x + 80){ //Tjekker om player 1 er i lava ved venstre side.
DødP1 = 0;
Player1Liv = 0;
iLava = 1;
if(y < 500){
y++;
}
}

if(x > 900){ //Tjekker om player 1 er i lava ved højre side.
DødP1 = 0;
Player1Liv = 0;
iLava = 1;
if(y < 500){
y++;
}
}
   }
}

我感觉这个错误是因为我没有在某处重画导致的。

所以,问题列表...

第一个

有两个 JFrame - 哪一个实际用于什么?据我所知, SpillerOne 永远不会显示,所以它不可能对关键事件做出反应。同样,您的 ActionListener 似乎没有附加到任何可以实际生成操作的东西。

这也引发了一堆关于SpillerOneGrafik之间关系的问题。它们似乎共享变量名,但它们无法共享状态,因此即使 KeyListener 有效,Grafik 也永远不会反映 SpillerOne 状态的变化

第二

您以错误的方式实现了自定义绘画。强烈建议不要覆盖 paint,相反,您应该覆盖 paintComponent 并调用 super.paintComponent 以确保维护油漆链的要求

有关详细信息,请参阅 Performing Custom Painting and Painting in AWT and Swing

你似乎也在你的 Grafik class 中加入了很多状态逻辑,随着复杂性的增加,这将变得更加难以维护。相反,每个不同的操作都应该是它自己的 class,专注于执行尽可能少的专用操作

第三

KeyListener 是监控关键事件的糟糕选择。虽然有一些“黑客”试图通过 KeyListener“解决”与焦点相关的问题,但其中 none 可以获得可靠的结果。

如果您研究 KeyListener 相关问题,您很快就会发现 Key bindings API 通常被视为解决问题的最可靠方法

总体

你的代码没有意义。为什么有两个框架? ActionListener 的作用是什么?它是如何附加到生成动作的东西上的?为什么 Grafik 不充当 key/action 监听器?

我认为你有一些重要的思考和重新设计要做