dar - eventos de botones en java
Adjuntar un solo oyente de acción a todos los botones (4)
Tú podrías...
Cree una instancia única de ActionListner y aplíquela a todos los botones
Tú podrías...
Utilice la API Actions , que le permitirá crear un ActionListerner autónomo, que también incluye los detalles para configurar los botones.
Tengo un programa con muchos botones, todos los cuales realizarán la misma función. Me preguntaba si había una forma de conectar un solo oyente a todos los JButton existentes en el programa.
Algo como:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class CalculatorPanel extends JPanel
{
private JTextField display;
public CalculatorPanel()
{
Action numberAction = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
display.setCaretPosition( display.getDocument().getLength() );
display.replaceSelection(e.getActionCommand());
}
};
setLayout( new BorderLayout() );
display = new JTextField();
display.setEditable( false );
display.setHorizontalAlignment(JTextField.RIGHT);
add(display, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(0, 5) );
add(buttonPanel, BorderLayout.CENTER);
for (int i = 0; i < 10; i++)
{
String text = String.valueOf(i);
JButton button = new JButton( text );
button.addActionListener( numberAction );
button.setBorder( new LineBorder(Color.BLACK) );
button.setPreferredSize( new Dimension(50, 50) );
buttonPanel.add( button );
KeyStroke pressed = KeyStroke.getKeyStroke(text);
InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(pressed, text);
button.getActionMap().put(text, numberAction);
}
}
private static void createAndShowUI()
{
// UIManager.put("Button.margin", new Insets(10, 10, 10, 10) );
JFrame frame = new JFrame("Calculator Panel");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new CalculatorPanel() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
La Action
obtendrá el objeto fuente del evento para que sepa en qué botón se hizo clic.
Si necesita usar la lógica if / else en su Acción, entonces debe crear una Acción por separado. No fuerce el código en una acción si no pertenece.
Hay muchas formas de hacerlo.
¿Controlas la creación de estos botones? En caso afirmativo, crea una fábrica y adjunta un oyente antes de devolver el objeto
De lo contrario, puede atravesar el árbol giratorio y comprobar, por ejemplo, JButton y conectarlo a un partido
También puede pensar en el enfoque de ActionMap / InputMap donde una acción puede ser almacenada e invocada en base a la política de enfoque.
Además, puedes extender JButton ...
Simplemente agregue el ActionListener a los botones.
Para la acción específica que depende de la fuente, puede usar lo que escribí o usar ActionCommands (que básicamente vincula ciertos componentes a ''comandos'' que se envían al ActionListener en un evento).
Aquí hay un pequeño ejemplo:
public class MyClass implements ActionListener
{
JButton button1;
JButton button2;
JButton button3;
public MyClass()
{
button1 = new JButton();
button2 = new JButton();
button3 = new JButton();
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
}
@Override
public void ActionPerformed(ActionEvent e)
{
//do stuff
//if you want to do something depending on the button pressed
//check the source
if (e.getSource() == button1)
{
//do stuff
}
}
}