当把它调成main时,Keylistener和actionlistener不起作用。

时间:2018-03-20 19:25:59

标签: java swing jpanel actionlistener keylistener

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

主要:

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

我感觉这个错误是因为我没有在某处重新绘制而引起的。

1 个答案:

答案 0 :(得分:1)

所以,一系列问题......

第一

有两个JFrame - 其中一个实际用于什么?据我所知,SpillerOne永远不会显示,因此没有办法让它能够对关键事件作出反应。同样,您的ActionListener似乎并未附加到可以实际生成操作的任何内容。

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

第二

您以错误的方式实施了自定义绘画。我们强烈建议您覆盖paint,而应该覆盖paintComponent并调用super.paintComponent以确保支持涂料链的要求

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

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

第三

KeyListener是监控关键事件的不良选择。虽然有&#34; hacks&#34;试图&#34;解决&#34; KeyListener与焦点相关的问题,没有一个能够取得可靠的结果。

如果您对KeyListener相关问题进行任何研究,您会很快发现Key bindings API经常被视为解决问题的最可靠解决方案

总体

你的代码毫无意义。为什么有两个框架?什么是ActionListener以及它如何附加到生成动作的东西上?为什么Grafik没有充当关键/动作监听器?

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