【问题标题】:Java cannot get action/key listener to workJava 无法让动作/关键侦听器工作
【发布时间】:2023-02-20 19:45:57
【问题描述】:

我正在编写一个 Java 乒乓球游戏,我被困在如何让玩家球拍移动上。我出于某种原因无法让程序注意到关键输入。

import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Pong {

     Board board = new Board();  


    
    public void frame() {
         JFrame b = new JFrame("Pong");
         b.setSize(905,705);
         b.setLocation(300,60);
         b.setResizable(false);
         b.setVisible(true);
         b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
         b.add(board);

         

    }

    public static  void main(String[] args) {
        Pong start = new Pong();
        start.frame();





    }


}

板类

public class Board extends JPanel{
       public int playerScore = 0;
       public int opponentScore = 0;
       Player player = new Player();
       int test = 1;
       private Timer timer;
       private int time = 100;{
          timer = new Timer(time, player);
          timer.start();
        }
       public void paint(Graphics g) {
           Graphics2D g2d = (Graphics2D) g;

           board(g);
           g.setColor(Color.WHITE);
          // player.playerGenerate();
           g2d.fill(player.player);
            g.fillRect(30, test, 20, 20);
            player.paint(g);
            control();
    
          //repaint();
           }
           
       

       
       public void board(Graphics g) {
           Graphics2D g2d = (Graphics2D) g;
           
            g.setColor(Color.black);
            g.fillRect(0, 0, 900, 900);
            Stroke stroke1 = new BasicStroke(4f);
            
            g2d.setColor(Color.white);
            g2d.setStroke(stroke1);
             
            g2d.drawRect(20, 50, 850, 600);
            g2d.setColor(Color.white);
            
            float[] dashingPattern2 = {10f, 4f};
            Stroke stroke2 = new BasicStroke(4f, BasicStroke.CAP_BUTT,
                    BasicStroke.JOIN_MITER, 1.0f, dashingPattern2, 0.0f);
             
            g2d.setStroke(stroke2);
            g2d.drawLine(435, 50, 435, 650);
            g.setFont(new Font("arial",Font.PLAIN,30));
            g.drawString(""+playerScore, 20, 35);
            g.drawString(""+opponentScore, 855, 35);
          


       }
       
       public void control() {
           if (player.down == true) {
               
               player.playerYpos = player.playerYpos = player.playerYpos -10;
               repaint();

           
           }
       }
}

最后是玩家类。


public class Player extends JPanel  implements KeyListener,ActionListener{
    //Board theBoard = new Board();    

    public boolean down = false;
    public boolean up = false;
    public int playerXpos = 45;
    public int playerYpos = 300;
    public int playerWidth = 15;
    public int playerHeight = 80;
    Rectangle player = new Rectangle(playerXpos,playerYpos,playerWidth,playerHeight);
    

    // Board theBoard = new Board();
    public void playerGenerate() {
        playerXpos = 45;
        playerYpos = 300;
        playerWidth = 15;
        playerHeight = 80;
        
    //Rectangle r = new Rectangle(playerXpos,playerYpos,playerWidth,playerHeight);
    }
    


    @Override
    public void actionPerformed(ActionEvent e) {
            if (down) {
                
                down = true;

                if(up != true) {
                    down = true;
                }
                else
                {
                    up = true;
                    down = false;
                
                    
                }

            }
            
            if (up) {
                
                up = true;

                if(down != true) {
                    up = true;

                }
                else
                {
                    up = false;
                    down = true;
                
                    
                }

            }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_UP) {

            for(int r = playerYpos;r >=0;r--) {
                if(r==0) {
                    playerYpos = playerYpos -20;
                    
                }
                
                else {
                    playerYpos =    playerYpos -1 ;

                }
                
                if(playerYpos < 50){
                    playerYpos = 50;
                }
            }
                //repaint();
            
        }
        if(e.getKeyCode() == KeyEvent.VK_DOWN) {

            for(int r = playerYpos;r >=0;r--) {
                if(r==0) {
                    playerYpos = playerYpos +20;
                    
                }
                
                else {
                    playerYpos =    playerYpos -1 ;
                    System.out.print("down");

                }
                
                if(playerYpos > 800){
                    playerYpos = 800;
                }
            }
                //repaint();
            }
        }
    

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
}

我试着用谷歌搜索并查看了采用类似方法在播放器/桨类中实现动作/按键侦听器的代码。我假设有一些我只是没有看到的小事。

【问题讨论】:

  • 您永远不会将 keylistener 添加到对象
  • @Jens 你是说董事会班?这对代码没有影响,实际上它只是在那里尝试,也许看看它是否有效。

标签: java object actionlistener keylistener pong


【解决方案1】:

您刚刚写了方法名称。您需要将动作/键侦听器注册到您想要侦听的特定摇摆组件。
假设如果您的 JComponent 是名为 btnPlayer 的 JButton,您需要注册执行的操作事件,例如:
private void btnPlayerActionPerformed(java.awt.event.ActionEvent e) {....
...}
您可以从 swing design 添加动作侦听器。右键单击 JComponent -> Events -> ActionPerformed。
它将为组件注册点击事件。通过属性添加事件是更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多