java swing actionlistener multidimensional-array jtogglebutton

java - Simple ActionListener dentro de una matriz 2D de JButtons



swing multidimensional-array (4)

En lugar de ''e.getSource ()'', siempre puede llamar a ''e.getActionCommand ()''. Para cada botón, puede especificar esto de la siguiente manera:

JButton button = new JButton("Specify your parameters here"); /*you get these from getActionCommand*/ button.setText("title here"); /*as far as I remember*/

Está bien, entonces estoy haciendo un conjunto 2d de JToggleButtons. Hice que el oyente de acción se pusiera en marcha, pero no tengo manera de decir qué botón es cuál.

Si hago clic en uno, todo lo que devuelve es algo así como

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 =, text =]

¿Hay alguna forma de pegar algún tipo de artículo o número en el objeto del botón para asociar cada botón? Y luego, cuando se hace clic en el botón, ¿puedo recuperar ese artículo o número que se le dio?

Aquí está el código de mi generador de botones. (¿Cómo podría hacer que "int l" se asocie (y cuente) a cada botón que se hace, cuando se lo llama, devolverá ese número, o algo similar en esa línea?

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

"fuente" de la variable es lo que uso para obtener mis datos, así que ¿cómo se puede devolver int l a través de "fuente" (como su valor único para el botón único al que se hace clic) cuando se hace clic en un botón?

Gracias, -Austin


Hice un juego de dragaminas y me encontré con un problema similar. Una de las únicas formas en que puede hacerlo es obtener la ubicación absoluta del botón en el que se hace clic, luego dividirlo por la xey entre los botones, por lo que para mí fue

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

Este código era para verificar si el área tenía bombas. Así que tuve una diferencia de 25 xey entre la ubicación de las bombas. Eso solo te dará una idea general sobre cómo hacer esto.

Creo: (x - x espacio en el lado izquierdo) / buffer - 1 funcionaría.


Simplemente agregue los datos de fila y columna a cada oyente. Puede agregar un constructor explícito, pero le sugiero agregar un pequeño método (que puede haber agregado más adelante).

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

(En JDK8, debería poder usar un lambda para reducir el desorden de sintaxis).

Y luego cambiarle el nombre con un nombre mejor.


una forma muy simple es agregar ClientProperty al JComponent, agregar a su definición en bucle, por ejemplo

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

renombrar e al MyActionListener y cambiar su contenido

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

EDITAR:

para MinerCraft clon no es necesario implementar OY de Listeners , solo hay sobre Icon , descubre que en este código (no implementas ninguno de los Listeners y elimina ItemListener usado)

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