Как получить X и Y индекс элемента внутри GridLayout? - PullRequest
15 голосов
/ 09 октября 2011

Я изучаю Java-учебник и увидел, что способ найти индексы x / y JButton внутри GridLayout - это пройти через двумерный массив кнопок 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);
  }
}

Ответы [ 5 ]

18 голосов
/ 10 октября 2011

В этом примере показано, как создать кнопку сетки, которая знает свое местоположение в сетке. Метод getGridButton() показывает, как эффективно получить ссылку на кнопку на основе координат сетки, а слушатель действия показывает, что нажатые и найденные кнопки идентичны.

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<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();
            }
        });
    }
}
9 голосов
/ 09 октября 2011

Вы сохранили массив всех кнопок JB; Вы можете искать 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
    }
  }
}
5 голосов
/ 09 октября 2011

Из кнопок J

  • Кнопка J # setName (строка);

  • JBUtton # setActionCommand (строка);

  • JBUtton # setAction (Action);

из / в контейнер

SwingUtilities # convert ...

SwingUtilities # getDeepestComponentAt

1 голос
/ 09 октября 2016

это решение выбирает все объекты между ними, как они
первый написать метод, который получает текст или все необходимое для 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());

    }

}
1 голос
/ 25 апреля 2013

Вы можете использовать setName () для сохранения в JButton его местоположения (например, button.setName (i + "" + j);) при его создании; затем вы можете получить к нему доступ, разделив строку, полученную из button.getName (), вокруг пробела. Это не особенно эффективный метод, но он немного похож на то, что вы ищете (или уже искали).

...