当前位置: 首页 > 面试题库 >

JPanel的addMouseListener

苏彭薄
2023-03-14
问题内容

今天,我遇到了一个问题..我的程序制作了一个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();
        }
    }

问题答案:

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();
            }
        });
    }
}

看看如何编写鼠标侦听器以了解更多详细信息…



 类似资料:
  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 当我试图调用actionPerformed方法中的panel2时,我得到了NullPointerException。请帮我摆脱这愚蠢的prblm。 action事件没有附加在panel2中,这是导致此异常的原因吗?

  • 我想在我的基本框架中添加一个带有JPanel的JScrollpane 如果我将带有的直接添加到中,就可以了。但是现在,当我将帧的大小减小到500像素以下时,变得更小,如第二张图片所示。 如何使JScrollPane工作?

  • 我真的对此感到困惑。我在做“微旅行”游戏。这是手机游戏,但我是为电脑制作的。我有一个扩展JPanel的背景类,它只绘制一个从0开始的矩形,并且有屏幕的大小(我的游戏是全屏)。我有一个主菜单类,它也扩展了JPanel。我想在那里添加主菜单的所有内容。然后,我将所有内容添加到扩展JFrame的GameFrame类中。我有一个main类,它只是调用GameFrame类。下面是我的代码:背景类: Main

  • 我有一个,名为,布局设置为。在面板内部有三个,分别添加到、和。现在,我的要求是,如果单击Settings按钮,它将在上方显示一个透明的。这个透明的面板将包含一个不透明的,更小的,居中的面板,其中将包含设置的东西。 我知道我可以使用来实现这一点,但是查看教程,它说您只能使用绝对定位来放置不同深度的组件,我知道这是非常不鼓励的。 是否有其他方法可以做到这一点,而不使用绝对定位?

  • 主要内容:1 Java JPanel的介绍,2 Java JPanel的声明,3 Java JPanel的构造方法,4 Java JPanel的案例1 Java JPanel的介绍 JPanel是最简单的容器类。它提供了一个空间,应用程序可以在其中附加任何其他组件。它继承了JComponents类。 它没有标题栏。 2 Java JPanel的声明 3 Java JPanel的构造方法 方法 描述 JPanel() 用于创建具有双缓冲区和流布局的新JPanel。 JPanel(boolean i