¿Cómo obtener el índice de elemento X e Y dentro de GridLayout?

Estoy estudiando un tutorial de Java y vi que la manera de encontrar los índices x / y de un JButton dentro de un GridLayout es atravesar una matriz bidimensional de botones b que está asociada al diseño y verificar si

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); } } 

¿Hay una manera más fácil de obtener los índices X / Y de un botón?

Algo como:

 JButton button = (JButton) ev.getSource(); int x = this.getContentPane().getComponentXIndex(button); int y = this.getContentPane().getComponentYIndex(button); 

this es una instancia de GameWindow y ev el ActionEvent se activa cuando el usuario presiona el botón.

En este caso, debería obtener: 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); } } 

Este ejemplo muestra cómo crear un botón de cuadrícula que conoce su ubicación en la cuadrícula. El método getGridButton() muestra cómo obtener una referencia de botón de manera eficiente en función de sus coordenadas de cuadrícula, y el oyente de acción muestra que los botones cliqueados y encontrados son idénticos.

GridButtonPanel

 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 list = new ArrayList(); 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(); } }); } } 

Has guardado una matriz de todos los JButtons; puedes buscar ae.getSource() y tienes el puesto.

 for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if( b[i][j] == ae.getSource() ) { // position i,j } } } 

De JButtons

  • JButton # setName (String);

  • JBUtton # setActionCommand (String);

  • JBUtton # setAction (Acción);

desde / hasta contenedor

SwingUtilities # convert …

SwingUtilities # getDeepestComponentAt

Puede usar setName () para almacenar dentro de un JButton su ubicación (por ejemplo, button.setName (i + “” + j);) cuando lo crea; a continuación, puede acceder al dividir la cadena que obtiene de button.getName () alrededor del espacio. No es un método especialmente eficiente, pero suena un poco como lo que estás buscando (o lo estabas buscando).

esta solución selecciona todo objeto entre ellos como ellos
primer método de escritura que obtiene texto o Todo lo necesario para Jbuuton o jlable o …. segundo cambio bajo código

 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()); } }