为JPanel添加MouseListener

10

今天我遇到了一个问题... 我的程序创建了一个8x8的网格,当我点击一个JButton时会显示其坐标。

但是我不想使用JButton,而是需要用JPanel。但是我的addMouseListener无法正常工作,所以我不知道如何解决这个问题,已经搜寻了4小时......

    package coordboutons;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class CoordBoutons extends JFrame {

        CoordBoutons() {
            super("GridLayout");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            Container contenant = getContentPane();
            contenant.setLayout(new GridLayout(8, 8));

            for (int i = 0; i < 8; i++) 
                for (int j = 0; j < 8; j++)
                    contenant.add(new CaseEchiquier(i, j));

            pack();
            setVisible(true);
        }

        **class CaseEchiquier extends JPanel** {
            private int lin, col;
            CaseEchiquier(int i, int j) {
                lin = i;
                col = j;
                setPreferredSize(new Dimension(80, 75));
                setBackground((i + j) % 2 == 0 ? Color.WHITE : Color.GRAY);
                addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        System.out.println((char)('a' + col) + "" + (8 - lin));

                    }
                });
            }


        }

        public static void main(String[] args) {
            JFrame.setDefaultLookAndFeelDecorated(true);
            CoordBoutons coordBoutons = new CoordBoutons();
        }
    }

我可能在这里漏掉了什么,但是ActionListener不是MouseListener - MadProgrammer
你的意思是addActionListener不起作用。那是因为你不能用这种类型的监听器向JPanel注册。 - Reimeus
你想给你的面板添加一个鼠标监听器,对吧?但是你的代码中写着ActionListener,在JPanel中并没有ActionListener方法。而且我认为为64个面板添加64个新的MouseListeners不是一个好主意,你只需要一个就可以了。所以在你的CaseEchiquier(int i, int j, MouseListener m)中添加一个MouseListener作为参数。 - Anthony Raimondo
2
我拒绝使用JButton……为什么? - wchargin
2个回答

14

JPanel 没有 ActionListener 功能。 相反,您需要使用 MouseListener

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CoordBoutons extends JFrame {

    CoordBoutons() {
        super("GridLayout");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container contenant = getContentPane();
        contenant.setLayout(new GridLayout(8, 8));

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                contenant.add(new CaseEchiquier(i, j));
            }
        }

        pack();
        setVisible(true);
    }

    class CaseEchiquier extends JPanel {

        private int lin, col;

        CaseEchiquier(int i, int j) {
            lin = i;
            col = j;
            setPreferredSize(new Dimension(80, 75));
            setBackground((i + j) % 2 == 0 ? Color.WHITE : Color.GRAY);
            addMouseListener(new MouseAdapter() {
                private Color background;

                @Override
                public void mousePressed(MouseEvent e) {
                    background = getBackground();
                    setBackground(Color.RED);
                    repaint();
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    setBackground(background);
                }
            });
//            addActionListener(new ActionListener() {
//                public void actionPerformed(ActionEvent evt) {
//                    System.out.println((char) ('a' + col) + "" + (8 - lin));
//
//                }
//            });
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                CoordBoutons coordBoutons = new CoordBoutons();
            }
        });
    }
}

请查看如何编写鼠标监听器以获取更多详细信息...


哦,太感谢了,我已经搜索了很长时间...现在我明白它是如何工作的,我可以通过点击一个格子来获取坐标 =) - user2360545
谢谢你的帮助!非常有用 ;) 但是,我想知道如何在不使用“System.out.println”的情况下从每个案例中获取坐标。我想要像getX()和getY()这样的东西,其中包含字母A-H(列)和数字1-8(行)。 - user2360545
这将取决于比你实际拥有的更多信息,你需要知道每列的宽度和每行的高度。更好的解决方案可能是使用类本身的信息,即 lincol - MadProgrammer

13
问题在于JPanel不存在addActionListener方法。您应该为此情况使用适当的监听器(java.awt.event.MouseListener)。由于MouseListener是一个接口(您不希望实现所有方法),您可以使用MouseAdapter,仅覆盖您需要的方法,像这样:
addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println((char)('a' + col) + "" + (8 - lin));
    }
});

非常感谢,我现在明白了 =) 帮助太棒了! - user2360545

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接