我正在研究一个java教程,并发现在GridLayout中查找JButton的x / y索引的方法是遍历与布局关联的按钮b的二维数组,并检查是否
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);
}
}
是否有更简单的方法来获取按钮的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);
}
}
答案 0 :(得分:17)
此示例显示如何创建一个知道其在网格上的位置的网格按钮。方法getGridButton()
显示了如何根据网格坐标有效地获取按钮引用,并且动作侦听器显示单击和找到的按钮是相同的。
package gui;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @see http://stackoverflow.com/questions/7702697
*/
public class GridButtonPanel {
private static final int N = 5;
private final List<JButton> list = new ArrayList<JButton>();
private JButton getGridButton(int r, int c) {
int index = r * N + c;
return list.get(index);
}
private JButton createGridButton(final int row, final int col) {
final JButton b = new JButton("r" + row + ",c" + col);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton gb = GridButtonPanel.this.getGridButton(row, col);
System.out.println("r" + row + ",c" + col
+ " " + (b == gb)
+ " " + (b.equals(gb)));
}
});
return b;
}
private JPanel createGridPanel() {
JPanel p = new JPanel(new GridLayout(N, N));
for (int i = 0; i < N * N; i++) {
int row = i / N;
int col = i % N;
JButton gb = createGridButton(row, col);
list.add(gb);
p.add(gb);
}
return p;
}
private void display() {
JFrame f = new JFrame("GridButton");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(createGridPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new GridButtonPanel().display();
}
});
}
}
答案 1 :(得分:9)
你已经保存了所有JButton的数组;您可以搜索ae.getSource()
并获得该职位。
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if( b[i][j] == ae.getSource() ) {
// position i,j
}
}
}
答案 2 :(得分:5)
来自JButtons
的JButton#的setName(字符串);
的JButton#setActionCommand(字符串);
的JButton#的setAction(动作);
from / to Container
答案 3 :(得分:1)
你可以使用setName()在JButton中创建它的位置(例如button.setName(i +“”+ j););然后,您可以通过在空格周围分割从button.getName()获得的字符串来访问它。它不是一种特别有效的方法,但它听起来有点像你现在(或者现在)正在寻找。
答案 4 :(得分:1)
这个解决方案选择像他们之间的所有对象 第一 写方法获取文本或Jbuuton或jlable所需的一切或.... 代码
下的第二次更改public class Event_mouse implements MouseListener {
@Override
public void mouseReleased(MouseEvent e) {
try {
Everything source = (Everything) e.getSource();
if(Everything.gettext==gol){
}
} catch (Exception ee) {
JOptionPane.showMessageDialog(null, ee.getMessage());
}
}
答案 5 :(得分:0)
我认为有更好的方法,例如,我创建了一个新的JButton类,该类从javax.swing扩展了JButton,将其命名为JButton2,然后向其添加了2个新属性(xGridPos和yGridPos),如下所示:>
private class JButton2 extends JButton{
public int xGridPos;
public int yGridPos;
}
当我创建一个新的JButton2时,我在网格上的x和y位置设置了这个新属性,因此您可以获取x和y并将其与getSource和cast一起使用:
private class ListenerTest implements ActionListener{
public void actionPerformed(ActionEvent theActionEvent){
JButton2 theButton = (JButton2)actionE.getSource();
// Use the xGridPos and yGridPos in section with theButton.xGridPos or
// theButton.xGridPos
}
}
我希望这对您有帮助:D。
答案 6 :(得分:0)
您不需要按钮显式存储它们的 x,y 位置。 考虑以下代码:
JComponent e=//something with GridLayout
var count=e.getComponentCount();
var row=count/11;//for example, you have an 11*11 grid
var col=count%11;
var bb=new JButton(row+" "+col);//or any other text you like
bb.addActionListener(unused->System.out.println(
"pressed button "+count+ " in row="+row+" col="+col
));
this.add(bb);