Простой ActionListener в 2D массиве JButtons - PullRequest
1 голос
/ 16 февраля 2012

Хорошо, поэтому я делаю 2d массив JToggleButtons.Я включил прослушиватель действий, но не могу сказать, какая кнопка какая.

Если я нажму одну, все, что она возвращает, будет выглядеть примерно так:

javax.swing.JToggleButton [, 59,58,19x14, alignmentX = 0,0, alignmentY = 0,5, граница = javax.swing.plaf.BorderUIResource $ CompoundBorderUIResource @ 53343ed0, флаги = 296, MaximumSize =, MinimumSize =, PreferredSize =, DefaultIcon =, disabledIcon =, disabledSelectedIcon =, рентабельность = javax.swing.plaf.InsetsUIResource [наверх = 2, слева = 14, снизу = 2, справа = 14], paintBorder = верно, paintFocus = верно, pressedIcon =, rolloverEnabled = ложь, rolloverIcon =, rolloverSelectedIcon=, selectedIcon =, text =]

Есть ли какой-нибудь элемент или номер в объекте кнопки, чтобы связать каждую кнопку?И затем, когда кнопка нажата, я могу получить тот элемент или номер, который ей был присвоен?

Вот мой код генератора кнопок.(Как я могу сделать так, чтобы «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);
    }

}

переменная «источник» - это то, что я использую для получения своих данных, так как же можно вернуть int l через «источник» (как уникальное значение для уникальной кнопки, нажатой) при нажатии кнопки?

Спасибо, -Остин

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012

очень простой способ - добавить 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"));
}

EDIT:

для MinerCraft клон не требуется для реализации только Слушателей , есть только около 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 голос
/ 16 февраля 2012

Просто добавьте данные строки и столбца каждому слушателю. Вы можете добавить явный конструктор, но я предлагаю добавить небольшой метод (который может быть добавлен к нему позже).

            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 вы должны иметь возможность использовать лямбду для уменьшения беспорядка синтаксиса.)

И затем переименовать его с лучшим именем.

0 голосов
/ 16 февраля 2012

Вместо e.getSource () вы всегда можете вызвать e.getActionCommand ().Для каждой кнопки вы можете указать это следующим образом:

JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/
button.setText("title here"); /*as far as I remember*/
0 голосов
/ 16 февраля 2012

Я сделал игру тральщика и столкнулся с подобной проблемой.Один из единственных способов сделать это - получить абсолютное местоположение нажатой кнопки, а затем разделить его на x и y между кнопками, поэтому для меня это было

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

Этот код былпроверьте, были ли в районе бомбы.Таким образом, у меня было 25 раз и у разницы между расположением бомб.Это просто даст вам общее представление о том, как это сделать.

Я полагаю: (x - x интервал с левой стороны) / buffer - 1 будет работать.

...