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在屏幕上显示)。因此,您可以创建简单的对象并将它们分布在网格上,在网格上单击网格对象,它应该响应单击,因此抓住您的方法,然后调用它 希望这有帮助