Maison >Java >javaDidacticiel >Comment puis-je déterminer efficacement les coordonnées X et Y d'un élément dans un GridLayout ?

Comment puis-je déterminer efficacement les coordonnées X et Y d'un élément dans un GridLayout ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-03 21:24:41268parcourir

How Can I Efficiently Determine the X and Y Coordinates of an Element in a GridLayout?

Déterminer efficacement les coordonnées des éléments dans un GridLayout

Identifier les coordonnées x et y d'un élément spécifique dans un GridLayout peut souvent poser un défi. Bien qu'une approche courante consiste à parcourir un tableau bidimensionnel de boutons pour établir leur relation, il existe une méthode plus efficace.

Cette approche alternative exploite les méthodes getComponentXIndex() et getComponentYIndex() du composant conteneur. En référençant la source d'un événement, ces méthodes peuvent rapidement fournir les coordonnées souhaitées.

Par exemple, considérons l'extrait de code Java suivant :

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

Ce code récupère efficacement les x et y indices du bouton en fonction de sa source d'événement.

Dans l'exemple d'application Java Swing fourni, la méthode getGridButton() joue un rôle central dans l'obtention de la référence du bouton. en utilisant efficacement les coordonnées de la grille. De plus, l'écouteur d'action démontre l'équivalence des boutons cliqués et trouvés.

La classe GridButtonPanel améliorée illustre cette approche, où chaque bouton est identifié de manière unique par ses coordonnées dans la grille. En cliquant sur n'importe quel bouton, le code vérifie la cohérence entre les références de bouton attendues et réelles.

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

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

Cette approche améliorée simplifie le processus d'obtention des coordonnées des éléments dans un GridLayout, éliminant le besoin de parcours complexes et améliorant l'efficacité. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn