gpt4 book ai didi

java - 鼠标监听器不适用于 Java 中的 JFrame

转载 作者:行者123 更新时间:2023-11-30 06:13:20 25 4
gpt4 key购买 nike

我正在尝试用 Java 制作 2D 游戏。我需要一种方法来检测玩家攻击和其他一些东西的鼠标输入。我的游戏中已经有一个可用的 Key Listener,但是当我尝试以与添加 Key Listener 相同的方式添加 Mouse Listener 时,它不起作用。

这是我的鼠标监听器类(现在只是一些测试代码,这些行永远不会在控制台中输出,即使在显示器上无处不在时也是如此)

package input;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MouseInput extends MouseAdapter
{
public MouseInput()
{

}

@Override
public void mouseClicked(MouseEvent e)
{
System.out.println("Hello");
}

@Override
public void mousePressed(MouseEvent e)
{
System.out.println("Mouse Pressed");
}

@Override
public void mouseReleased(MouseEvent e)
{
System.out.println("Mouse Released");
}
}

这也是我的显示类,我在其中创建了一个 JFrame 并向其中添加了 Canvas 、按键监听器和鼠标监听器。

package display;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;

import input.KeyInput;
import input.MouseInput;


public class Display
{
public static JFrame frame;
private Canvas canvas;

private String title;
private int width;
private int height;

private static double currtime = System.nanoTime();
private static double lasttime = 0;
private static double delta = 0;
private static float fps = 30;
private static int tick = 0;

public Display(String title, int width, int height)
{
this.title = title;
this.width = width;
this.height = height;

createDisplay();
}

private void createDisplay()
{
frame = new JFrame(title);
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setFocusable(true);

canvas = new Canvas();
canvas.setPreferredSize(new Dimension(width, height));
canvas.setMinimumSize(new Dimension(width, height));
canvas.setMaximumSize(new Dimension(width, height));
canvas.setBackground(Color.WHITE);

frame.add(canvas);
frame.addKeyListener(new KeyInput()); // Add the keyListener
frame.addMouseListener(new MouseInput()); // Add the mouseListener
frame.pack();
System.out.println(frame.getMouseListeners().length + " mouse listener found"); // This line outputs 1 mouse listener found
System.out.println(frame.getKeyListeners().length + " key listener found"); // This line outputs 1 key listener found

}

public void update() // Called every frame
{
frame.requestFocus();
tick++;
lasttime = currtime;
currtime = System.nanoTime();
delta = (currtime - lasttime) / 1000000000;
fps = (float) (1 / delta);
if (tick / getFPS() >= 2)
{
tick = 0;
System.out.println("FPS = " + Math.round(getFPS()));
try
{
System.out.println("Mouse Position = " + frame.getMousePosition().getX()
+ ", " + frame.getMousePosition().getY());
}
catch (Exception e)
{
System.out.println("Mouse out of screen. Could not get mouse position (NullPointerException)");
}
}
}

public int getWidth()
{
return width;
}

public int getHeight()
{
return height;
}

public Canvas getCanvas()
{
return canvas;
}

public JFrame getFrame()
{
return frame;
}

public static float getFPS()
{
return fps;
}
}

我浏览了这个论坛寻找答案,但给出的每个答案都没有解决问题。

如果您需要更多信息来帮助您解决问题,请告诉我,在此先感谢您的帮助 :D

最佳答案

将 MouseListener 添加到覆盖 JFrame 的 Canvas 对象,您的代码将起作用。请注意,作为附带建议,您不应将 AWT 与 Swing 组件混合使用。使用 JPanel 而不是 Canvas 对象。

稍后我们可能会谈到为什么通常应避免使用 KeyListeners,但由于这不是您问题的重点,我们现在可以搁置它。

例如,

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class Display2 extends JPanel {
private int prefW;
private int prefH;

public Display2(int prefW, int prefH) {
this.prefW = prefW;
this.prefH = prefH;
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}

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

private static void createAndShowGui() {
Display2 mainPanel = new Display2(500, 500);

JFrame frame = new JFrame("Display");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

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

class MyMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
System.out.printf("Mouse Pressed at: %s%n", e.getPoint());
}

@Override
public void mouseReleased(MouseEvent e) {
System.out.printf("Mouse Released at: %s%n", e.getPoint());
}

@Override
public void mouseDragged(MouseEvent e) {
System.out.printf("Mouse Dragged at: %s%n", e.getPoint());
}
}

关于java - 鼠标监听器不适用于 Java 中的 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039529/

25 4 0
文章推荐: java - 如何从包含键 String 和 list 的 hashmap 中仅获取一个值