gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:15:13 26 4
gpt4 key购买 nike

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

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 配合使用而构建,并且具有使该功能轻松且良好运行的机制。例如,假设您决定只有在用户填写了两个 JTextField 后才启用 JButton,并且您使用 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/22580243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com