JButtons的2D数组中的简单ActionListener

好的,所以我正在制作一个2d的JToggleButtons数组。 我得到了动作监听器,但我无法分辨哪个按钮是哪个。

如果我点击一个,它返回的就像是

javax.swing.JToggleButton [,59,58,19×14,alignmentX = 0.0,alignmentY = 0.5,边界= javax.swing.plaf.BorderUIResource $ CompoundBorderUIResource @ 53343ed0,旗帜= 296,MAXIMUMSIZE =,=的minimumSize,首选大小=,=的DefaultIcon ,disabledIcon =,disabledSelectedIcon =,余量= javax.swing.plaf.InsetsUIResource [顶= 2,左= 14,底= 2,右= 14],的paintBorder =真,paintFocus =真,pressedIcon =,rolloverEnabled =假,rolloverIcon =,rolloverSelectedIcon =,selectedIcon =,文本=]

无论如何在按钮对象中粘贴某种项目或数字以关联每个按钮? 然后当点击按钮时,我可以检索给它的项目或编号?

这是我的按钮生成器代码。 (我如何使“int l”关联(和计数)到每个按钮,当它被调用时,它将返回该数字,或沿着这些行返回的东西。

JToggleButton buttons[][] = new JToggleButton[row][col]; int l = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { buttons[i][j] = new JToggleButton(""); buttons[i][j].setSize(15,15); buttons[i][j].addActionListener(new e()); panel.add(buttons[i][j]); l++; } } 

ActionListner

 public class e implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); System.out.println(source); } } 

变量“source”是我用来获取数据的东西,那么当点击一个按钮时,如何通过“source”(作为单击的唯一按钮的唯一值)返回int l?

谢谢, – 奥斯汀

非常简单的方法是将ClientProperty添加到JComponent,将您的定义添加到循环中,例如

 buttons[i][j].putClientProperty("column", i); buttons[i][j].putClientProperty("row", j); buttons[i][j].addActionListener(new MyActionListener()); 

e重命名为MyActionListener并更改其内容

 public class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JToggleButton btn = (JToggleButton) e.getSource(); System.out.println("clicked column " + btn.getClientProperty("column") + ", row " + btn.getClientProperty("row")); } 

编辑:

对于MinerCraft克隆不需要实现监听器的 ony,只有大约Icon ,在这段代码中找出(不要实现任何监听器和anf删除使用过的ItemListener)

在此处输入图像描述

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonsIcon extends JFrame { private static final long serialVersionUID = 1L; private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon"); private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon"); private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon"); public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ButtonsIcon t = new ButtonsIcon(); } }); } public ButtonsIcon() { setLayout(new GridLayout(2, 2, 4, 4)); JButton button = new JButton(); button.setBorderPainted(false); button.setBorder(null); button.setFocusable(false); button.setMargin(new Insets(0, 0, 0, 0)); button.setContentAreaFilled(false); button.setIcon((errorIcon)); button.setRolloverIcon((infoIcon)); button.setPressedIcon(warnIcon); button.setDisabledIcon(warnIcon); add(button); JButton button1 = new JButton(); button1.setBorderPainted(false); button1.setBorder(null); button1.setFocusable(false); button1.setMargin(new Insets(0, 0, 0, 0)); button1.setContentAreaFilled(false); button1.setIcon((errorIcon)); button1.setRolloverIcon((infoIcon)); button1.setPressedIcon(warnIcon); button1.setDisabledIcon(warnIcon); add(button1); button1.setEnabled(false); final JToggleButton toggleButton = new JToggleButton(); toggleButton.setIcon((errorIcon)); toggleButton.setRolloverIcon((infoIcon)); toggleButton.setPressedIcon(warnIcon); toggleButton.setDisabledIcon(warnIcon); toggleButton.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (toggleButton.isSelected()) { } else { } } }); add(toggleButton); final JToggleButton toggleButton1 = new JToggleButton(); toggleButton1.setIcon((errorIcon)); toggleButton1.setRolloverIcon((infoIcon)); toggleButton1.setPressedIcon(warnIcon); toggleButton1.setDisabledIcon(warnIcon); toggleButton1.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (toggleButton1.isSelected()) { } else { } } }); add(toggleButton1); toggleButton1.setEnabled(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } } 

只需将行和列数据添加到每个侦听器即可。 你可以添加一个显式的构造函数,但我建议添加一个小方法(以后可能会添加更多的方法)。

  buttons[i][j].addActionListener(e(i, j)); ... private ActionListener e(final int i, final int j) { return new ActionListener() { // i and j available here ... 

(在JDK8中,您应该能够使用lambda来减少语法混乱。)

然后用更好的名称重命名它。

我做了一个扫雷游戏并遇到了类似的问题。 你可以做到的唯一方法之一就是获得点击按钮的绝对位置,然后将它除以按钮之间的x和y,所以对我来说它是

 if ((e.getComponent().getX() != (randx) * 25 && e.getComponent().getY() != (randy) * 25) &&bomb[randx][randy] == false) { 

这段代码是为了检查该地区是否有炸弹。 所以我在炸弹的位置上有25 x和y的差异。 这将只是给你一个关于如何做到这一点的一般想法。

我相信:(左侧是x – x间距)/缓冲区 – 1可以工作。

您可以随时调用’e.getActionCommand()’而不是’e.getSource()’。 您可以通过以下方式指定每个按钮:

 JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/ button.setText("title here"); /*as far as I remember*/