java - 如何从网格中获取我单击的组件?

标签 java oop click mouseevent grid-layout

我正在显示一个对象网格,并且我想打印我单击的对象的名称。但是,以下代码仅在我单击左上角的方 block 时记录一次单击,然后每张卡都会打印其名称。

知道我需要做什么不同的事情吗?

public class GHand extends JPanel {

    GCard[] grid; //names the grid of buttons

    public GHand(int width, int height, Hand hand) { //constructor
        this.setLayout(new GridLayout(width, 4));
        grid = new GCard[hand.size()]; //allocate the size of grid
        for (int i = 0; i < grid.length; i++) {
            grid[i] = new GCard(hand.getCard(i)); //creates new card
            this.add(grid[i]); //adds card to grid
        }

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                super.mouseClicked(me);
                for (GCard g : grid) {

                    if (g.contains(me.getPoint())) {//check if mouse is clicked within card

                        System.out.println("Clicked a " + g.getCardName());

                    }
                }
            }
        });
    }
}

我想为网格中的每个对象添加监听器会很浪费,对吧?对此的最佳实践是什么?

最佳答案

我认为你走在正确的道路上......

我认为您不应该使用 MouseEvent,因为它跟踪鼠标运动和单击,因此您必须跟踪网格项的确切位置。 您可能想要这样做,但您必须创建更多代码才能解决网格项的位置,并且这将涉及与 GUI 相关的许多复杂代码。

我的观点是,您应该使用 ActionEvent Listener,这样当您单击某个对象(我假设是 JPanel 或 Button 对象)时,您可以响应发生的单击。 通过.getCommand()方法。

您必须更改 GHand 对象或 GCard 对象(取决于您用来在网格上显示的内容)以包含可用于区分不同对象的名称变量。 (这可以像确定对象 ID 的单个计数器方法一样简单)或者您可以将其保留为名称变量。 您必须重写 .toString() 方法(在 GHand/GCard 对象内部),以便允许 .getCommand() 方法以读者友好的响应进行响应,以便您可以根据单击的内容来 Bootstrap 流程.

<小时/>

这不应该浪费添加监听器,因为您应该已经添加到单个对象类中。我假设您正在使用网格来允许用户单击对象(我不知道是否使用带有多个 GCard 的多个 GHand,还是仅使用带有多个 GCard 的一个 GHand 来显示在屏幕上)。因此,您可以创建简单的对象并将它们分布在网格上,您可以在其中单击网格对象,它应该响应单击,因此获取您的方法然后调用它。

希望这有帮助!

关于java - 如何从网格中获取我单击的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188063/

相关文章:

java - Spring 3.1.1 web MVC - 限制对接口(interface) getter 的响应

jQuery 在 prev 中找到相同的 td。和下一行

安卓 : Chess question click a button to determine piece and then a 2nd button to determine move destination

Python 对象生命周期特征

oop - 快速将单个文件类转换为文件夹类

java - 具有泛型的构建器

button - Bootstrap 单击以调用

java - Joda DateTime 在解析字符串时自动更改时区

java - Apache 光束 : No Runner was specified and the DirectRunner was not found on the classpath

java - 将行数据读取到字符串数组中?