Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从网格中获取单击的组件?_Java_Oop_Click_Mouseevent_Grid Layout - Fatal编程技术网

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

Java 如何从网格中获取单击的组件?,java,oop,click,mouseevent,grid-layout,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.setLay

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

你知道我需要做些什么吗

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

                    }
                }
            }
        });
    }
}
公共类GHand扩展了JPanel{
GCard[]grid;//命名按钮的网格
公共GHand(整数宽度、整数高度、手动){//constructor
这个.setLayout(新的GridLayout(宽度,4));
grid=new GCard[hand.size()];//分配网格的大小
对于(int i=0;i

我想为网格中的每个对象添加一个侦听器是浪费的,对吗?这方面的最佳做法是什么?

我认为您的做法是正确的

我认为您不应该使用MouseeEvent,因为它跟踪鼠标运动和单击,因此您必须跟踪网格项的确切位置。 您可能希望这样做,但您必须创建更多的代码来解决网格项的位置问题,这将涉及到许多复杂的GUI代码

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

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


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

希望这有帮助