java - MouseListener 中的 getX 和 getY 问题

标签 java swing mouselistener

我正在编写塔防游戏,现在我遇到了一些与 MouseListener 有关的问题。我已经创建了鼠标处理类(它实现了鼠标监听器)和第二个类,整个屏幕由油漆(图形 g)制成。我想检查玩家是否按下塔来购买它。不起作用的是, getX() 和 getY() 返回 0 而不是屏幕上的正确坐标。我应该改变什么?

public class MouseHandler implements MouseListener, MouseMotionListener {

    private GameScreen screen;
    private GameScreen.MouseHeld mouseHeld;

    public MouseHandler(GameScreen screen){
        this.screen = screen;
        this.mouseHeld = this.screen.new MouseHeld();
    }

    public void mouseClicked(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {
        this.mouseHeld.mouseDown(e);
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseDragged(MouseEvent e) {
        this.mouseHeld.mouseMove(e);
    }

    public void mouseMoved(MouseEvent e) {
        this.mouseHeld.mouseMove(e);
    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }

}

并使用屏幕进行类:

public class GameScreen extends JPanel implements Runnable {

    private static final long serialVersionUID = 1L;

    public Thread thread = new Thread(this) 

    public GameScreen(GameFrame frame) {
        this.frame = frame;
        this.setSize(1280, 800);
        this.addMouseListener(new MouseHandler(this));

        thread.start();

    }

    public void paint(Graphics g) {
        // Code with my painted screen

    }

    // Some code with running game

    public class MouseHeld {


        boolean mouseDown = false;


        int hand = 0;
        int handXPos;
        int handYPos;

        public void mouseDown(MouseEvent e) {
            mouseDown = true;

            if(hand != 0){

                hand = 0;
            }
            System.out.println(handYPos);
            System.out.println(handXPos);
            uptadeMouse(e);
        }

        public void mouseMove(MouseEvent e) {
            handXPos = e.getX();
            handYPos = e.getY();
        }

        public void uptadeMouse(MouseEvent e) {
            if (mouseDown && hand == 0) {

                if (handYPos <= 680 && handYPos >= 640) {

                    // Tower 1
                    if (handXPos >= 300 && handXPos <= 340) {
                        if (player.money >= Tower.allTowers[0].cost) {
                            System.out.println("You bought a tower!");
                            hand = 1;
                        }
                    }
                }
            }
        }
    }

}

最佳答案

您仅更新 mouseMove 中的 handXPos 和 handYPos,而不更新其他鼠标方法。您永远不会将处理程序添加为 MouseMotionListener,因此 mouseMove 永远不会被调用。

例如,

public GameScreen(GameFrame frame) {
    this.frame = frame;
    this.setSize(1280, 800); // avoid this

    MouseHandler mouseHandler = new MouseHandler(this);     
    addMouseListener(mouseHandler);
    addMouseMotionListener(mouseHandler);
}

另一个更好的解决方案是更新所有使用的鼠标方法中的 handXPos 和 handYPos。

这是我的最小测试程序,您应该为将来的问题提供一些内容:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.*;

public class FooGui {
   private static void createAndShowGui() {
      FooGui mainPanel = new FooGui();

      GameFrame frame = new GameFrame("Foo Gui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(new GameScreen(frame));
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MouseHandler implements MouseListener, MouseMotionListener {

   private GameScreen screen;
   private GameScreen.MouseHeld mouseHeld;

   public MouseHandler(GameScreen screen) {
      this.screen = screen;
      this.mouseHeld = this.screen.new MouseHeld();
   }

   public void mouseClicked(MouseEvent e) {

   }

   public void mousePressed(MouseEvent e) {
      this.mouseHeld.mouseDown(e);
   }

   public void mouseReleased(MouseEvent e) {

   }

   public void mouseDragged(MouseEvent e) {
      this.mouseHeld.mouseMove(e);
   }

   public void mouseMoved(MouseEvent e) {
      this.mouseHeld.mouseMove(e);
   }

   public void mouseEntered(MouseEvent e) {

   }

   public void mouseExited(MouseEvent e) {

   }

}

class GameScreen extends JPanel {

   private static final long serialVersionUID = 1L;
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private GameFrame frame;

   public GameScreen(GameFrame frame) {
      this.frame = frame;
      this.setSize(1280, 800);
      MouseHandler mouseHandler = new MouseHandler(this);

      addMouseListener(mouseHandler);
      addMouseMotionListener(mouseHandler);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   public class MouseHeld {
      boolean mouseDown = false;
      int handXPos;
      int handYPos;

      public void mouseDown(MouseEvent e) {
         mouseDown = true;

         System.out.println(handYPos);
         System.out.println(handXPos);
         uptadeMouse(e);
      }

      public void mouseMove(MouseEvent e) {
         handXPos = e.getX();
         handYPos = e.getY();
      }

      public void uptadeMouse(MouseEvent e) {
      }
   }

}

class GameFrame extends JFrame {

   public GameFrame(String name) {
      super(name);
   }

}

还要避免重写 JPanel 的 Paint 方法,而倾向于使用 PaintComponent

查看:

关于java - MouseListener 中的 getX 和 getY 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414988/

相关文章:

java - 在查询中设置为 null 的准备好的语句不返回任何记录

java - 重置 System.in/out

java - 适用于 Android 的 Facebook 分数 API

java - Swing 步进式光标移动

java - JFrame 和 MouseListener 无法正确执行单击的问题

java - java线程setName时安全吗

java - 如何在使用 rs2xml 填充的 Jtable 中添加复选框

java - 如何在 Swing 中获取可访问父级(面板)的名称?

java - 循环遍历 JPanel 中的嵌套字段

java - 在监听器方法中使用 GC