如何让MouseListener方法在Java中工作?

如何让MouseListener方法在Java中工作?,java,swing,Java,Swing,我对java非常陌生,我正在制作一个简单的像素艺术制作工具。我复制了一个for循环来画圆圈。 我在用鼠标点击的方法。我这样做是为了当我点击时,它打印“左”或“右” 这是网格系统: 这是我使用的MouseEvent系统: 唯一的问题是它不打印“左”和“右”。这是我的密码: import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swi

我对java非常陌生,我正在制作一个简单的像素艺术制作工具。我复制了一个for循环来画圆圈。 我在用鼠标点击的方法。我这样做是为了当我点击时,它打印“左”或“右”

这是网格系统:

这是我使用的MouseEvent系统:

唯一的问题是它不打印“左”和“右”。这是我的密码:

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

class Main extends JComponent implements MouseListener {
  public static void main(String[] args) {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 600, 584);
    window.getContentPane().add(new Main());
//    window.setResizable(false);
    window.setVisible(true);

  }

  public void paint(Graphics g) {
    int rows = 20;

    int cols = 20;
    int width = getSize().width;
    int height = getSize().height;

    // draw the rows
    int rowHt = height / (rows);
    for (int i = 0; i < rows; i++)
      g.drawLine(0, i * rowHt, width, i * rowHt);

    // draw the columns
    int rowWid = width / (cols);
    for (int i = 0; i < cols; i++)
      g.drawLine(i * rowWid, 0, i * rowWid, height);

  }

  public void MapCalculations(MouseEvent e) { 
    // If left mouse button is clicked
    if (SwingUtilities.isLeftMouseButton(e)) {
        System.out.println("Left");

    } 
    // If right mouse button is clicked
    else if (SwingUtilities.isRightMouseButton(e)) {
        System.out.println("Right");
    }
  }

  @Override
  public void mouseClicked(MouseEvent e) {
    MapCalculations(e);
  }

  @Override
  public void mousePressed(MouseEvent e) {}

  @Override
  public void mouseReleased(MouseEvent e) {}

  @Override
  public void mouseEntered(MouseEvent e) {}

  @Override
  public void mouseExited(MouseEvent e) {}

  public void mouseDragged(MouseEvent e) {
    MapCalculations(e);
  }
}
导入java.awt.Graphics;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
类Main扩展JComponent实现MouseListener{
公共静态void main(字符串[]args){
JFrame窗口=新JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
窗口.立根(30,30,600,584);
window.getContentPane().add(newmain());
//window.setresizeable(false);
window.setVisible(true);
}
公共空间涂料(图g){
int行=20;
int cols=20;
int width=getSize().width;
int height=getSize().height;
//划行
int rowHt=高度/(行);
对于(int i=0;i
由于框架不知道何时调用鼠标侦听器方法,因此永远不会调用鼠标侦听器方法

尝试将鼠标侦听器添加到主方法中的
窗口
对象,如下所示:

public static void main(String[] args) {
    JFrame window = new JFrame();
    Main myMain = new Main();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 600, 584);
    window.getContentPane().add(myMain);
//    window.setResizable(false);
    window.setVisible(true);    
    window.addMouseListener(myMain);
  }

从未调用该方法,因为从未向任何内容添加鼠标侦听器

你可能想要,在主构造函数中

this.addMouseListener(this);

您也应该尊重Java命名约定。方法以小写字符开头。您不应该使用
paint()
在Swing组件上绘制。阅读。

这里有一个提示。在内部类中实现mouseListener

类MyMouseListener扩展了MouseAdapter{
公共无效mouseClicked(MouseEvent e){
地图计算(e);
}
公共无效鼠标标记(鼠标事件e){
地图计算(e);
}
}
然后使用该实例来处理鼠标事件。内部阶级仍然存在 访问封闭类的值

window.addMouseListener(new MyMouseListener());

通过这种方式,您不需要拥有所有这些空方法。此外,您还可以使用
由于
MouseAdapter
类对
MouseListener
mouseMotionListener

的两个接口都有空方法,所以对
mouseMotionListener
的要求使用相同的鼠标侦听器类是的,我知道现在不要觉得自己很笨,我不能告诉你有多少次我忘记了添加侦听器…不要不同意答案,但是第一行“你从不向任何东西添加鼠标侦听器”可以理解为“你不应该向任何东西添加鼠标侦听器”(我最初是如何读的,然后被下一行的建议弄糊涂了…)。我会考虑改写以使意思更清楚。