java - 获取按钮在网格布局上的位置

标签 java arrays swing jbutton mouselistener

如何使用网格布局获取单击按钮的位置(我的意思是行和列)?

public void init(final Container pane) {
    JPanel controls = new JPanel();
    int size = (int) Math.sqrt(puzzle.getSize() + 1);
    controls.setLayout(new GridLayout(size, size));
    for (int i = 0; i < puzzle.getSize(); i++) {
        int k = puzzle.getListItem(i);
        if (k == puzzle.getEmptyFlag())
            controls.add(new JLabel(""));
        else {
            JButton jb = new JButton(String.valueOf(k));
            jb.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    //get row and column
                }

            });
            controls.add(jb);
        }
    }
    pane.add(controls);
}

最佳答案

  1. 切勿为此目的在 JButton 上添加 MouseListener。请改用 ActionListener。
  2. 为什么不创建 JButton 的数组或 ArrayList,然后简单地迭代该列表以找到合适的数组或 ArrayList?

即,

private JButton[][] buttonGrid = new JButton[ROWS][COLS];

在其他地方,您需要用可行的 JButton 对象填充网格,并将这些 JButton 放入 GUI 中。

然后在程序中使用嵌套的 for 循环遍历网格,将网格按钮与 getSource() JButton 进行比较。

即在 JButton 的 ActionListener 中

public void actionPerformed(ActionEvent e) {
  for (int row = 0; row < ROWS; row++) {
    for (int col = 0; col < COLS; col++) {
       if buttonGrid[row][col] == e.getSource();
       // here you have your row and column
    }
  }
}
<小时/>

编辑
你问:

  1. why?

因为它在很多情况下都无法正常工作。 ActionListener 专为与 JButton 和 JMenuItem 配合使用而构建,并具有使该功能轻松且良好运行的机制。例如,假设您决定让一个 JButton 仅在用户填写了两个 JTextField 后才启用,并且您使用 JButton 的 setEnabled(booleanenabled) 方法来执行此操作,禁用 JButton 将不会停止MouseListener 停止工作,但它会停止 ActionListener。

<小时/>

编辑2

例如,

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ButtonGridEg extends JPanel {
   private static final int ROWS = 8;
   private static final int COLS = ROWS;
   private static final int GAP = 5;
   private JButton[][] buttonGrid = new JButton[ROWS][COLS];

   public ButtonGridEg() {
      setLayout(new GridLayout(ROWS, COLS, GAP, GAP));

      ActionListener buttonListener = new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent evt) {
            JButton selectedBtn = (JButton) evt.getSource();
            for (int row = 0; row < buttonGrid.length; row++) {
               for (int col = 0; col < buttonGrid[row].length; col++) {
                  if (buttonGrid[row][col] == selectedBtn) {
                     System.out.printf("Selected row and column: %d %d%n", row, col);
                  }
               }
            }
         }
      };
      for (int row = 0; row < buttonGrid.length; row++) {
         for (int col = 0; col < buttonGrid[row].length; col++) {
            String text = String.format("Button [%d, %d]", row, col);
            buttonGrid[row][col] = new JButton(text);
            buttonGrid[row][col].addActionListener(buttonListener);
            add(buttonGrid[row][col]);
         }
      }
   }

   private static void createAndShowGui() {
      ButtonGridEg mainPanel = new ButtonGridEg();

      JFrame frame = new JFrame("ButtonGridEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - 获取按钮在网格布局上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61444004/

相关文章:

java - Android 开发 : Class That Creates an Object, 调用一些方法然后返回该对象(如何?)

java - 是否可以从 Hibernate Criteria 中删除订单?

php - PHP 是否对数组设置内存限制?

java - 在 for 循环中执行 SwingWorker

java - 使用 JPA 先由父级排序,然后由子级排序

java - 如何在Spring Boot中对同级包进行组件扫描

c - 在 C 中创建动态数组(指针)/调整其大小时出现问题

arrays - ngStorage 数组在加载时重置

java - GridBagLayout的一些问题

java - JScrollPane中的JTextArea, View 坐标平移