Java 将Keylistener和actionlistener调用到main时,它们不工作。

Java 将Keylistener和actionlistener调用到main时,它们不工作。,java,swing,jpanel,actionlistener,keylistener,Java,Swing,Jpanel,Actionlistener,Keylistener,我想做一个小游戏,在那里你可以四处走动。我已经写了一个代码,它确实有效。但当我试图缩短代码并使其看起来更漂亮时,我偶然发现了一个我自己无法解决的错误 主要内容: package eksamenstest; import javax.swing.JFrame; public class Eksamenstest extends JFrame { public Eksamenstest() throws InterruptedException { JFram

我想做一个小游戏,在那里你可以四处走动。我已经写了一个代码,它确实有效。但当我试图缩短代码并使其看起来更漂亮时,我偶然发现了一个我自己无法解决的错误

主要内容:

    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似乎并没有附加到任何可以实际生成动作的东西上

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

第二 您以错误的方式实现了自定义绘制。强烈反对重写paint,相反,您应该重写paintComponent并调用super.paintComponent以确保满足paint链的要求

有关详细信息,请参阅和

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

第三 KeyListener是监视关键事件的糟糕选择。虽然有一些黑客试图用KeyListener解决与焦点相关的问题,但没有一个能够获得可靠的结果

如果您对KeyListener相关问题进行任何研究,您会很快发现,通常认为最可靠的解决方案是

全面的 你的代码毫无意义。为什么有两个框架?ActionListener是做什么的?它是如何连接到生成动作的东西上的?为什么Grafik不能充当键/动作监听器


我想你有一些重要的想法和重新设计要做

我试着缩短我的代码,让它看起来更好实际上如果没有所有这些就更好了。哦,是的,很抱歉,我应该叫它Player.Length或StartPositionX,这样更容易理解,我的错。我试图缩短我的代码,让它看起来更漂亮-如果你能创建的话会更好。我会研究一下,谢谢你给我的提示如何让我的代码看起来更漂亮。好吧。。。1.在图形中,我扩展了JFrame,以获取在Eksamenstest;中创建的框架内的图形;。在私有类SpillerOne中,我扩展了JFrame,因为我认为,通过这样做,ActionListener将对JFrame做出反应,从而使它工作。但事实并非如此。在Grafik中,我只想用这个方法创建图形,然后调用keylistener来移动图形。我确实写了一个类似的代码,确实有效,但我主要写了570行,这比这个代码更混乱。是的,这也引发了一系列关于SpillerOne和Grafik之间关系的问题。它们似乎在共享变量名,但无法共享状态,因此即使KeyListener工作,Grafik也不会反映SpillerOnes状态中的更改,这正是我想要修复的。如何使这两个类彼此共享变量?Neahle对模型-视图-控制器范例进行了一些研究。首先,KeyListener和Key Bindings API只在屏幕上可见的组件上工作,因此您必须通过Grafik组件完成初始密钥处理-然后它可能触发对管理总体状态的某个模型的更新好的,我将对此进行研究。