JFrame 上的 MouseListener 从未被调用
MouseListener on JFrame never being called
我正在尝试使用 MouseListener 来查看何时在我的 JFrame 中单击了某些内容,但是曾调用过 none 事件(mouseClicked、mouseEntered 等)。我正在使用 Canvas 将游戏绘制到 JFrame 上,我想知道这是否可能是问题所在,但我不确定如何修复它。我正在学习 this 教程,我的代码看起来几乎完全一样。
这是我的 JFrame class:
public class Display extends JFrame implements MouseListener {
public static int width;
public static int height;
public static final int CARD_SIZE = 100;
public static final int BUFFER_SIZE = 25;
public static final int TITLE_SIZE = 50;
private JFrame frame;
private MyCanvas canvas;
public Display (int r, int c, Card[][] b) {
width = c*CARD_SIZE + (c+2)*BUFFER_SIZE;
System.out.println(width);
height = r*CARD_SIZE + (r+1)*BUFFER_SIZE + TITLE_SIZE*2;
System.out.println(height);
frame = new JFrame("Matching Game");
frame.setLayout(null);
frame.setSize(width, height);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setFocusable(true);
frame.addMouseListener(this);
canvas = new MyCanvas(b);
frame.add(canvas);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse Clicked at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse Entered frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse Exited frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse Pressed at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse Released at X: " + e.getX() + " - Y: " + e.getY());
}
}
您做错的主要事情是扩展 JFrame 并创建一个的显式实例。如下操作。
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Display implements MouseListener {
public static int width;
public static int height;
public static final int CARD_SIZE = 100;
public static final int BUFFER_SIZE = 25;
public static final int TITLE_SIZE = 50;
private JPanel canvas;
private JFrame frame;
public static void main(String[] args) {
new Display(3,3,new int[3][3]);
}
public Display (int r, int c, int[][] b) {
width = c*CARD_SIZE + (c+2)*BUFFER_SIZE;
System.out.println(width);
height = r*CARD_SIZE + (r+1)*BUFFER_SIZE + TITLE_SIZE*2;
System.out.println(height);
frame = new JFrame("Matching Game");
// frame.setLayout(null);
// frame.setSize(width, height);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setFocusable(true);
frame.addMouseListener(this);
canvas = new JPanel();
canvas.setPreferredSize(new Dimension(width,height));
frame.add(canvas);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse Clicked at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse Entered frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse Exited frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse Pressed at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse Released at X: " + e.getX() + " - Y: " + e.getY());
}
}
要考虑的要点
- 不要扩展 JFrame,只使用一个实例。
- Canvas老了。我推荐使用一个 JPanel 来保存组件 and/or painting
frame.setLocationRelativeTo(null)
您的框架在屏幕上居中。
- 因为我没有
Card
class 我用 int[][]
来演示这个。
- 我所做的任何其他事情,请查看 API 文档以获取解释。
有关 GUI 等的更多信息,请查看 Java Tutorials
我正在尝试使用 MouseListener 来查看何时在我的 JFrame 中单击了某些内容,但是曾调用过 none 事件(mouseClicked、mouseEntered 等)。我正在使用 Canvas 将游戏绘制到 JFrame 上,我想知道这是否可能是问题所在,但我不确定如何修复它。我正在学习 this 教程,我的代码看起来几乎完全一样。
这是我的 JFrame class:
public class Display extends JFrame implements MouseListener {
public static int width;
public static int height;
public static final int CARD_SIZE = 100;
public static final int BUFFER_SIZE = 25;
public static final int TITLE_SIZE = 50;
private JFrame frame;
private MyCanvas canvas;
public Display (int r, int c, Card[][] b) {
width = c*CARD_SIZE + (c+2)*BUFFER_SIZE;
System.out.println(width);
height = r*CARD_SIZE + (r+1)*BUFFER_SIZE + TITLE_SIZE*2;
System.out.println(height);
frame = new JFrame("Matching Game");
frame.setLayout(null);
frame.setSize(width, height);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setFocusable(true);
frame.addMouseListener(this);
canvas = new MyCanvas(b);
frame.add(canvas);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse Clicked at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse Entered frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse Exited frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse Pressed at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse Released at X: " + e.getX() + " - Y: " + e.getY());
}
}
您做错的主要事情是扩展 JFrame 并创建一个的显式实例。如下操作。
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Display implements MouseListener {
public static int width;
public static int height;
public static final int CARD_SIZE = 100;
public static final int BUFFER_SIZE = 25;
public static final int TITLE_SIZE = 50;
private JPanel canvas;
private JFrame frame;
public static void main(String[] args) {
new Display(3,3,new int[3][3]);
}
public Display (int r, int c, int[][] b) {
width = c*CARD_SIZE + (c+2)*BUFFER_SIZE;
System.out.println(width);
height = r*CARD_SIZE + (r+1)*BUFFER_SIZE + TITLE_SIZE*2;
System.out.println(height);
frame = new JFrame("Matching Game");
// frame.setLayout(null);
// frame.setSize(width, height);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setFocusable(true);
frame.addMouseListener(this);
canvas = new JPanel();
canvas.setPreferredSize(new Dimension(width,height));
frame.add(canvas);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse Clicked at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse Entered frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse Exited frame at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse Pressed at X: " + e.getX() + " - Y: " + e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse Released at X: " + e.getX() + " - Y: " + e.getY());
}
}
要考虑的要点
- 不要扩展 JFrame,只使用一个实例。
- Canvas老了。我推荐使用一个 JPanel 来保存组件 and/or painting
frame.setLocationRelativeTo(null)
您的框架在屏幕上居中。- 因为我没有
Card
class 我用int[][]
来演示这个。 - 我所做的任何其他事情,请查看 API 文档以获取解释。
有关 GUI 等的更多信息,请查看 Java Tutorials