1

好的,所以我正在制作一个二维 JToggleButtons 数组。我让动作监听器启动并开始运行,但我无法分辨哪个按钮是哪个。

如果我单击一个,它返回的只是类似

javax.swing.JToggleButton[,59,58,19x14,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@53343ed0,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon= ,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,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++;

            }
        }

动作监听器

public class e implements ActionListener {

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

}

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

谢谢,-奥斯汀

4

4 回答 4

3

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

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

重命名eMyActionListener并更改其内容

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

编辑:

对于MinerCraftclone 不需要实现任何Listeners,只有关于Icon,在这段代码中找出来(不要实现任何 Listeners 并删除使用的 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);
    }
}
于 2012-02-15T20:28:33.273 回答
1

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

            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 来减少语法混乱。)

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

于 2012-02-15T20:47:16.907 回答
0

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

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

此代码用于检查该区域是否有炸弹。所以我在炸弹位置之间有 25 x 和 y 的差异。这只会让您大致了解如何执行此操作。

我相信: (x - x 左侧间距) / buffer - 1 会起作用。

于 2012-02-15T20:15:08.587 回答
0

您可以随时调用“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*/
于 2012-02-15T20:17:42.007 回答