我正在显示一个对象网格,并且我想打印我单击的对象的名称。但是,以下代码仅在我单击左上角的方 block 时记录一次单击,然后每张卡都会打印其名称。
知道我需要做什么不同的事情吗?
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() 方法以读者友好的响应进行响应,以便您可以根据单击的内容来 Bootstrap 流程.
<小时/>这不应该浪费添加监听器,因为您应该已经添加到单个对象类中。我假设您正在使用网格来允许用户单击对象(我不知道是否使用带有多个 GCard 的多个 GHand,还是仅使用带有多个 GCard 的一个 GHand 来显示在屏幕上)。因此,您可以创建简单的对象并将它们分布在网格上,您可以在其中单击网格对象,它应该响应单击,因此获取您的方法然后调用它。
希望这有帮助!
关于java - 如何从网格中获取我单击的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188063/