Frage

Okay, ich mache ein 2D -Array von JtoggleButtons. Ich habe den Action -Hörer aufgeregt und ging, aber ich habe keine Möglichkeit zu sagen, welcher Button der ist.

Wenn ich auf eins klicke, ist alles zurückzugeben

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= , Disableabicon =, DisableabledSelectedicon =, margin = javax.swing.plaf.inSetsuiresource [top = 2, links = 14, boden = 2, rechts = 14], PaintBorder = True, PaintFocus = True, Pressedicon =, Rolloverenabled = False, Rollovericon, Rollovericon =, rolloverSelectedicon =, selectedicon =, text =

Gibt es sowieso eine Art Element oder Nummer in das Schaltflächenobjekt, um jede Taste zu verknüpfen? Und wenn die Schaltfläche angeklickt wird, kann ich dieses Element oder die Nummer abrufen, die ihm gegeben wurde?

Hier ist mein Button -Generatorcode. (Wie könnte ich "int l" zu jedem hergestellten Knopf intelligen (und zählen), wenn sie aufgerufen wird, diese Zahl zurückgibt oder etwas in dieser Richtung.

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

}

Variable "Quelle" ist das, was ich benutze, um meine Daten zu erhalten. Wie kann ich also durch "Quelle" zurückgegeben werden (als eindeutiger Wert für die eindeutige Schaltfläche klickte), wenn eine Schaltfläche geklickt wird?

Danke, -Austin

War es hilfreich?

Lösung

Sehr einfach ist die ClientProperty zum jComponent hinzu, fügen Sie Ihre Definition in die Schleife hinzu, z.

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

umbenennen e zum MyActionListener und ändern seinen Inhalt

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

BEARBEITEN:

zum MinerCraft Klon ist nicht erforderlich, um Ony von zu implementieren Zuhörer, Es gibt nur ungefähr Symbol, Finden Sie heraus, dass in diesem Code (implementieren Sie keinen der Hörer und entfernen Sie gebrauchte ElementListener).

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

Andere Tipps

Fügen Sie einfach die Zeile und die Spaltendaten zu jedem Hörer hinzu. Sie könnten einen expliziten Konstruktor hinzufügen, aber ich schlage vor, eine kleine Methode hinzuzufügen (was später möglicherweise mehr hinzugefügt hat).

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

(In JDK8 sollten Sie in der Lage sein, eine Lambda zu verwenden, um die Syntax -Unordnung zu reduzieren.)

Und dann mit einem besseren Namen umbenennen.

Ich machte ein Minesweeper -Spiel und stieß auf ein ähnliches Problem. Eine der einzigen Möglichkeiten, wie Sie es tun können, besteht darin, den absoluten Speicherort der Klick -Schaltfläche zu erhalten, und dies dann durch das x und y zwischen den Schaltflächen aufzuteilen, also war es für mich also

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

Dieser Code sollte überprüfen, ob das Gebiet Bomben hatte. Also hatte ich 25 x und y Unterschied zwischen der Lage der Bomben. Das gibt Ihnen nur eine allgemeine Vorstellung davon, wie Sie dies tun sollen.

Ich glaube: (x - X -Abstand auf der linken Seite) / Puffer - 1 würde funktionieren.

Anstelle von 'e.getSource ()' können Sie immer 'E.GetactactactactactionCommand ()' nennen. Für jede Schaltfläche können Sie dies angeben nach:

JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/
button.setText("title here"); /*as far as I remember*/
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top