如何获取GridLayout中元素的X和Y索引?
我正在学习 java 教程,发现在 GridLayout 中查找 JButton 的 x/y 索引的方法是遍历与布局关联的按钮 b 的二维数组,并检查是否
b[i][ j] == 按钮参考
。
@Override
public void actionPerformed(ActionEvent ae) {
JButton bx = (JButton) ae.getSource();
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
if (b[i][j] == bx)
{
bx.setBackground(Color.RED);
}
}
有没有更简单的方法来获取按钮的 X/Y 索引?
类似于:
JButton button = (JButton) ev.getSource();
int x = this.getContentPane().getComponentXIndex(button);
int y = this.getContentPane().getComponentYIndex(button);
this
是一个 GameWindow 实例,ev
当用户按下按钮时触发 ActionEvent。
在这种情况下应该得到: x == 2, y == 1
@GameWindow.java:
package javaswingapplication;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
public class GameWindow extends JFrame implements ActionListener
{
JButton b[][] = new JButton[5][5];
int v1[] = { 2, 5, 3, 7, 10 };
int v2[] = { 3, 5, 6, 9, 12 };
public GameWindow(String title)
{
super(title);
setLayout(new GridLayout(5, 5));
setDefaultCloseOperation(EXIT_ON_CLOSE );
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
{
b[i][j] = new JButton();
b[i][j].addActionListener(this);
add(b[i][j]);
}
}
@Override
public void actionPerformed(ActionEvent ae) {
((JButton)ae.getSource()).setBackground(Color.red);
}
}
@JavaSwingApplication.java:
package javaswingapplication;
public class JavaSwingApplication {
public static void main(String[] args) {
GameWindow g = new GameWindow("Game");
g.setVisible(true);
g.setSize(500, 500);
}
}
I am studying a java tutorial and saw that the way to find the x/y indexes of a JButton inside a GridLayout is to traverse a bidimensional array of buttons b which is associated to the layout and checking if
b[i][j] == buttonReference
.
@Override
public void actionPerformed(ActionEvent ae) {
JButton bx = (JButton) ae.getSource();
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
if (b[i][j] == bx)
{
bx.setBackground(Color.RED);
}
}
Is there an easier way to get the X/Y indexes of a button?
Something like:
JButton button = (JButton) ev.getSource();
int x = this.getContentPane().getComponentXIndex(button);
int y = this.getContentPane().getComponentYIndex(button);
this
being a GameWindow instance and ev
the ActionEvent triggered when the user presses the button.
In this case it should get: x == 2, y == 1
@GameWindow.java:
package javaswingapplication;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
public class GameWindow extends JFrame implements ActionListener
{
JButton b[][] = new JButton[5][5];
int v1[] = { 2, 5, 3, 7, 10 };
int v2[] = { 3, 5, 6, 9, 12 };
public GameWindow(String title)
{
super(title);
setLayout(new GridLayout(5, 5));
setDefaultCloseOperation(EXIT_ON_CLOSE );
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
{
b[i][j] = new JButton();
b[i][j].addActionListener(this);
add(b[i][j]);
}
}
@Override
public void actionPerformed(ActionEvent ae) {
((JButton)ae.getSource()).setBackground(Color.red);
}
}
@JavaSwingApplication.java:
package javaswingapplication;
public class JavaSwingApplication {
public static void main(String[] args) {
GameWindow g = new GameWindow("Game");
g.setVisible(true);
g.setSize(500, 500);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
此示例演示如何创建一个知道其在网格上位置的网格按钮。方法
getGridButton()
展示了如何根据网格坐标有效地获取按钮引用,并且动作监听器显示单击的按钮和找到的按钮是相同的。This example shows how to create a grid button that knows its location on the grid. The method
getGridButton()
shows how to obtain a button reference efficiently based on its grid coordinates, and the action listener shows that the clicked and found buttons are identical.您已经保存了所有 JButton 的数组;您可以搜索
ae.getSource()
并获得该位置。You have saved an array of all JButtons; you could search for
ae.getSource()
and you have the position.来自 JButtons
JButton#setName(String);
JBUtton#setActionCommand(String);
JBUtton#setAction(Action);
从/到容器
SwingUtilities#convert...
SwingUtilities#getDeepestComponentAt
From JButtons
JButton#setName(String);
JBUtton#setActionCommand(String);
JBUtton#setAction(Action);
from/to Container
SwingUtilities#convert...
SwingUtilities#getDeepestComponentAt
创建 JButton 时,您可以使用 setName() 在 JButton 中存储其位置(例如,button.setName(i+" "+j););然后,您可以通过在空格周围分割从 button.getName() 获得的字符串来访问它。这不是一种特别有效的方法,但听起来有点像您正在(或现在)正在寻找的方法。
You can use setName() to store within a JButton its location(ex. button.setName(i+" "+j);) when you create it; you can then access it by splitting the string you get from button.getName() around the space. It is not an especially efficient method, but it sounds a little like what you are (or were, by now) looking for.
该解决方案选择像它们一样的所有对象
第一的
编写获取文本或 Jbuuton 或 jlable 所需的一切的方法或......
代码下的第二次更改
this solution selects everything object between like them
first
write method that get text or Everything needed for Jbuuton or jlable or....
second change under code
我认为有更好的方法,例如我创建了一个新的 JButton 类,它从 javax.swing 扩展了 JButton,我将其命名为 JButton2,然后我向它添加了 2 个新属性(xGridPos 和 yGridPos),如下所示
: JButton2 我使用网格上的 x 和 y 位置设置了这个新属性,以便您可以获得 x 和 y 并将它们与 getSource 和强制转换一起使用:
我希望这会有所帮助:D。
I think there is a better way, for example i made a new JButton class that extends JButton from javax.swing, i named it JButton2, then i added 2 new attributes to it (xGridPos and yGridPos) like this:
When I create a new JButton2 I set this new attributes with the x and y position on the grid so you can get the x and y and use them with getSource and using cast:
I hope this is helpfull :D.
您不需要按钮显式存储它们的 x,y 位置。
考虑以下代码:
You do not need your buttons to explicitly store their x,y position.
Consider the following code: