繁体   English   中英

如何获得从网格单击的组件?

[英]How can I get the component I clicked on from a grid?

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

知道我需要做些什么吗?

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()方法以读者友好的响应进行响应,以便您可以根据单击的内容来定向程序流。


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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM