JButtons的2D数组中的简单ActionListener

时间:2012-02-15 20:09:01

标签: java swing actionlistener multidimensional-array jtogglebutton

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

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

  

javax.swing.JToggleButton [,59,58,19x14,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”返回(作为单击的唯一按钮的唯一值)?

谢谢, -Austin

4 个答案:

答案 0 :(得分:3)

非常简单的方法是将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"));
}

编辑:

<{1}}克隆不需要MinerCraft克隆来实现Listeners,只有大约Icon,在此代码中找出(不执行任何监听器和删除)使用过ItemListener)

enter image description here

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

答案 1 :(得分: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来减少语法混乱。)

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

答案 2 :(得分:0)

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

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

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

我相信:(左侧是x - x间距)/缓冲区 - 1会起作用。

答案 3 :(得分: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*/