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

时间:2014-04-20 22:01:43

标签: java oop click mouseevent grid-layout

我正在显示一个对象网格,我想要打印我点击的对象的名称。但是,当我单击最左上角的方块时,以下代码仅注册一次单击,然后每张卡片都会打印其名称。

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

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

                    }
                }
            }
        });
    }
}

我想在网格中的每个对象上添加一个监听器会是浪费吗?对此最好的做法是什么?

1 个答案:

答案 0 :(得分:1)

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

我认为您不应该使用MouseEvent,因为它会跟踪鼠标移动并单击,因此您必须跟踪网格项的确切位置。 您可能希望这样做,但您必须创建更多代码才能解决网格项目的位置,并且需要使用非常复杂的代码来处理GUI。

我的意见是你应该使用 ActionEvent Listener ,这样当你点击一个对象时(我假设一个JPanel或Button对象),你可以回应已发生的点击。 通过 .getCommand()方法。

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


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

希望这有帮助!