Come ottenere l’indice X e Y dell’elemento all’interno di GridLayout?

Sto studiando un tutorial di java e ho visto che il modo per trovare gli indici x / y di un JButton all’interno di un GridLayout è di attraversare un array bidimensionale di pulsanti b che è associato al layout e controllare se

b[i][j] == buttonReference .

  @Override public void actionPerformsd(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); } } 

C’è un modo più semplice per ottenere gli indici X / Y di un pulsante?

Qualcosa di simile a:

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

this è un’istanza di GameWindow e ev ActionEvent triggersto quando l’utente preme il pulsante.

    In questo caso dovrebbe ottenere: 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); } } 

    Questo esempio mostra come creare un pulsante di griglia che conosca la sua posizione sulla griglia. Il metodo getGridButton() mostra come ottenere un riferimento di pulsante in modo efficiente in base alle sue coordinate di griglia e il listener di azioni mostra che i pulsanti cliccati e trovati sono identici.

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

    Hai salvato un array di tutti i JButtons; puoi cercare ae.getSource() e hai la posizione.

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

    Da JButtons

    • JButton # setName (String);

    • JButton # setActionCommand (String);

    • JButton # setAction (azione);

    da / a Contenitore

    SwingUtilities # convertire …

    SwingUtilities # getDeepestComponentAt

    Puoi usare setName () per memorizzare all’interno di un JButton la sua posizione (ad esempio button.setName (i + “” + j);) quando lo crei; puoi quindi accedervi dividendo la stringa che ottieni da button.getName () attorno allo spazio. Non è un metodo particolarmente efficiente, ma suona un po ‘come quello che sei (o che cercavi, ormai).

    questa soluzione seleziona tutto l’object tra loro simili
    primo metodo di scrittura che ottiene testo o Tutto il necessario per Jbuuton o jlable o …. secondo cambiamento sotto codice

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