[英]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.