Einfache ActionListener innerhalb eines 2D -Arrays von Jbuttons
-
25-10-2019 - |
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
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).
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*/