Código JAVA anterior:
Minimizar Ventana (JFrame).
Minimizar Ventana (JFrame).
-------------------------------------------------------------------------------------------
Este post está orientado a la aplicación e implementación de un fragmento de código JAVA, que nos permitirá asignar eventos a los componentes de un formulario, tales como: JButton, JComboBox y JTextField:Clase del Formulario:
public class Formulario extends javax.swing.JFrame implements KeyListener, ActionListener, ItemListener{ public Formulario() { initComponents(); jButton1.addActionListener(this); jButton2.addActionListener(this); jTextField1.addKeyListener(this); jComboBox1.addItemListener(this); jButton1.setActionCommand("Botón 1"); jButton2.setActionCommand("Botón 2"); }
public void keyTyped(KeyEvent e) {} public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void itemStateChanged(ItemEvent e) {} public void actionPerformed(ActionEvent e) {}
}
Instrucciones y Recomendaciones
1-Antes que todo, deberás copiar y pegar las siguientes librerías, las cuales son sumamente necesarias para que los eventos que vas a asignar a los componentes de tu formulario JAVA funcionen.
Recuerda pegarlas después de la línea de código que representa el nombre del paquete (package Formularios;) y sobre la línea de código que identifica el nombre de tu Clase (public class Formulario...):
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
2-Copia y pega la línea de código resaltada con amarillo justo antes de la llave de apertura "{" de tu Clase y posterior al nombre de la misma.
En este renglón, lo que hacemos es usar la expresión "implements" que nos permitirá implementar los métodos y/o funciones de las Clases abstractas (Interface) que manejan los eventos.
Posteriormente, comenzaremos a llamar las Clases que necesitamos y debemos separarlas con una coma (,); en este caso, empleamos las Clases: KeyListener (Eventos por pulsación de teclas), ActionListener (Eventos y/o acciones generadas por el usuario sobre un componente), y por último ItemListener (Eventos por cambio de selección de Ítems). Aunque tú puedes implementar más Clases abstractas, pero en este caso sólo usaremos las 3 anteriores.
En la primera parte de este fragmento, procedemos a asignar a cada componente de nuestro formulario, un tipo de evento. Para ello, usamos el nombre del componente (jButton1, jButton2, jTextField1, jComboBox1); luego, empleamos el método concerniente para asignar el evento (addActionListener, addKeyListener, addItemListener); si observas bien, te darás cuenta de que dichos métodos inician con la palabra "add" seguido del nombre de la Clase abstracta que queremos asociar a nuestro componente. Ahora, a dicho método debemos pasarle un parámetro, el cual en este caso corresponde a la palabra clave "this".
En la segunda parte del presente fragmento, lo que se hace es asignar un comando de acción, especialmente a los botones. Este comando de acción, es un texto que nos permitirá identificar el componente una vez se proceda a ejecutar un evento sobre el mismo, y así poder llevar a cabo las acciones correspondientes al elemento en cuestión, ya que varios componentes de un mismo tipo pueden estar usando el mismo tipo de evento. Lo que se hace en esta oportunidad, es usar el nombre del componente (jButton1, jButton2); seguidamente, se le aplica el método ".setActionCommand()" al cual se le pasa como parámetro un String ("Botón 1", "Botón 2"):
Encontraremos que a cada Clase le pertenecen un número determinado de métodos; por ejemplo, a la Clase KeyListener 3 métodos (keyTyped, keyPressed y keyReleased), a la Clase ItemListener 1 método (itemStateChanged), y a la Clase ActionListener 1 método (actionPerformed).
Debes tener presente que todo lo que coloques dentro de las funciones de:
*La Clase KeyListener (keyTyped, keyPressed, y keyReleased), se ejecutará cuando se produzca un determinado evento en el componente "jTextField1".
*La Clase ItemListener (itemStateChanged), se ejecutará cuando se reporte el evento determinado en el componente "jComboBox1".
*La Clase ActionListener (actionPerformed), se efectuará una vez se lleve a cabo el evento correspondiente en los elementos "jButton1" y "jButton2"
6-Un ejemplo, si colocas un código dentro del método "actionPerformed()"; este se ejecutará, si el usuario da clic sobre cualquiera de los dos botones. No sería algo muy útil que digamos, ya que en un software los botones de un formulario ejecutan distintas funciones; por lo cual, es aquí donde entraremos a hacer uso de los "Comandos de Acción" que le asignamos a estos componentes en el punto 3 del presente post.
Lo que se hace en sí, es usar un condicional "if" anidado, y allí en la condición procedemos a usar el parámetro "ActionEvent" representado por la letra "e", al cual le aplicaremos el método ".getActionCommand()"; seguidamente, llamamos al método ".equals()" y dentro de este colocamos el String que representa el nombre del "Comando de Acción". En otras palabras, comparas el "ActionCommand" del jButton presionado con uno determinado, y si se cumple la condición se procederá a ejecutar el código que necesitas:
Sin embargo, hay componentes a los cuales no se les puede aplicar el método ".getActionCommand()", lo cual significa un problema para identificar que componente ha sufrido un evento específico. Para solucionar este inconveniente, lo que hacemos es crear una variable del tipo "Object" a la que llamaremos en esta ocasión "componente", y en esta capturaremos el componente que ha sido objeto de un evento; para ello, usamos la variable "e" perteneciente al parámetro "ActionEvent" y le aplicamos el método ".getSource()".
Lo que se procederá a realizar ahora, será comparar en cada condicional "if", si el componente capturado es el mismo que hemos establecido en el condicional, y dependiendo de ello se procederá a ejecutar el código pertinente:
NOTA:
Cabe aclarar que los tipos de eventos cómo ActionListener no son exclusivos del jButton, tú puedes implementarlo en otros componentes; igualmente, lo mismo sucede con los demás tipos de eventos, aunque habrán algunas excepciones de componentes a los que no se les puede asignar un determinado Método Listener; como por ejemplo, a un JTextField no se le puede aplicar el método "addItemListener()"; pero sí, el método "addActionListener()".
En este renglón, lo que hacemos es usar la expresión "implements" que nos permitirá implementar los métodos y/o funciones de las Clases abstractas (Interface) que manejan los eventos.
Posteriormente, comenzaremos a llamar las Clases que necesitamos y debemos separarlas con una coma (,); en este caso, empleamos las Clases: KeyListener (Eventos por pulsación de teclas), ActionListener (Eventos y/o acciones generadas por el usuario sobre un componente), y por último ItemListener (Eventos por cambio de selección de Ítems). Aunque tú puedes implementar más Clases abstractas, pero en este caso sólo usaremos las 3 anteriores.
implements KeyListener, ActionListener, ItemListener
3-Procede a copiar y pegar el fragmento de color verde dentro del método Constructor de tu formulario JAVA (se recomienda que lo pegues después del método "initComponents();").En la primera parte de este fragmento, procedemos a asignar a cada componente de nuestro formulario, un tipo de evento. Para ello, usamos el nombre del componente (jButton1, jButton2, jTextField1, jComboBox1); luego, empleamos el método concerniente para asignar el evento (addActionListener, addKeyListener, addItemListener); si observas bien, te darás cuenta de que dichos métodos inician con la palabra "add" seguido del nombre de la Clase abstracta que queremos asociar a nuestro componente. Ahora, a dicho método debemos pasarle un parámetro, el cual en este caso corresponde a la palabra clave "this".
En la segunda parte del presente fragmento, lo que se hace es asignar un comando de acción, especialmente a los botones. Este comando de acción, es un texto que nos permitirá identificar el componente una vez se proceda a ejecutar un evento sobre el mismo, y así poder llevar a cabo las acciones correspondientes al elemento en cuestión, ya que varios componentes de un mismo tipo pueden estar usando el mismo tipo de evento. Lo que se hace en esta oportunidad, es usar el nombre del componente (jButton1, jButton2); seguidamente, se le aplica el método ".setActionCommand()" al cual se le pasa como parámetro un String ("Botón 1", "Botón 2"):
jButton1.addActionListener(this); jButton2.addActionListener(this); jTextField1.addKeyListener(this); jTextField2.addKeyListener(this); jComboBox1.addItemListener(this); jButton1.setActionCommand("Botón 1"); jButton2.setActionCommand("Botón 2");4-Debes implementar todos los métodos correspondientes a las Clases abstractas que llamaste; por lo cual, copia y pega las líneas resaltadas de azul afuera del método Constructor de tu Formulario; es decir, inmediatamente después de la llave de cierre "}" de dicho método.
Encontraremos que a cada Clase le pertenecen un número determinado de métodos; por ejemplo, a la Clase KeyListener 3 métodos (keyTyped, keyPressed y keyReleased), a la Clase ItemListener 1 método (itemStateChanged), y a la Clase ActionListener 1 método (actionPerformed).
public void keyTyped(KeyEvent e) {} public void keyPressed(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void itemStateChanged(ItemEvent e) {} public void actionPerformed(ActionEvent e) {}5-Lo siguiente que debes hacer, es colocar dentro de las llaves de apertura "{" y de cierre "}" de cada método, el código que quieres que se ejecute una vez se lleve a cabo un determinado evento.
Debes tener presente que todo lo que coloques dentro de las funciones de:
*La Clase KeyListener (keyTyped, keyPressed, y keyReleased), se ejecutará cuando se produzca un determinado evento en el componente "jTextField1".
*La Clase ItemListener (itemStateChanged), se ejecutará cuando se reporte el evento determinado en el componente "jComboBox1".
*La Clase ActionListener (actionPerformed), se efectuará una vez se lleve a cabo el evento correspondiente en los elementos "jButton1" y "jButton2"
6-Un ejemplo, si colocas un código dentro del método "actionPerformed()"; este se ejecutará, si el usuario da clic sobre cualquiera de los dos botones. No sería algo muy útil que digamos, ya que en un software los botones de un formulario ejecutan distintas funciones; por lo cual, es aquí donde entraremos a hacer uso de los "Comandos de Acción" que le asignamos a estos componentes en el punto 3 del presente post.
Lo que se hace en sí, es usar un condicional "if" anidado, y allí en la condición procedemos a usar el parámetro "ActionEvent" representado por la letra "e", al cual le aplicaremos el método ".getActionCommand()"; seguidamente, llamamos al método ".equals()" y dentro de este colocamos el String que representa el nombre del "Comando de Acción". En otras palabras, comparas el "ActionCommand" del jButton presionado con uno determinado, y si se cumple la condición se procederá a ejecutar el código que necesitas:
public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Botón 1")){ JOptionPane.showMessageDialog(null, "Hiciste clic en el botón #1"); }else if(e.getActionCommand().equals("Botón 2")){ JOptionPane.showMessageDialog(null, "Hiciste clic en el botón #2"); } }
Sin embargo, hay componentes a los cuales no se les puede aplicar el método ".getActionCommand()", lo cual significa un problema para identificar que componente ha sufrido un evento específico. Para solucionar este inconveniente, lo que hacemos es crear una variable del tipo "Object" a la que llamaremos en esta ocasión "componente", y en esta capturaremos el componente que ha sido objeto de un evento; para ello, usamos la variable "e" perteneciente al parámetro "ActionEvent" y le aplicamos el método ".getSource()".
Lo que se procederá a realizar ahora, será comparar en cada condicional "if", si el componente capturado es el mismo que hemos establecido en el condicional, y dependiendo de ello se procederá a ejecutar el código pertinente:
public void actionPerformed(ActionEvent e) { Object componente = e.getSource(); if(componente == jButton1){ JOptionPane.showMessageDialog(null, "Hiciste clic en el botón #1"); }else if(componente == jButton2){ JOptionPane.showMessageDialog(null, "Hiciste clic en el botón #2"); } }7-Ahora sólo basta con ejecutar tu proyecto y hacer las respectivas pruebas.
NOTA:
Cabe aclarar que los tipos de eventos cómo ActionListener no son exclusivos del jButton, tú puedes implementarlo en otros componentes; igualmente, lo mismo sucede con los demás tipos de eventos, aunque habrán algunas excepciones de componentes a los que no se les puede asignar un determinado Método Listener; como por ejemplo, a un JTextField no se le puede aplicar el método "addItemListener()"; pero sí, el método "addActionListener()".
¿Quieres aprender más de JAVA?
Si deseas ver cómo asignar eventos a un jButton, jComboBox, jTextField y demás elementos de un formulario, usando un IDE como NetBeans; además de otros interesantes temas, no olvides de revisar los tips de JAVA y seguir el Curso: Cómo lo hago en JAVA?
Accede a todos los fragmentos de código que hemos publicado en este lenguaje hasta el momento, dando clic en el siguiente enlace:
Ver listado de códigos JAVA
Suscríbete a nuestro blog, vía Email o RSS; además puedes seguirnos a través de nuestras redes sociales como: Facebook, Twitter, y Google+.
Ver listado de códigos JAVA
Suscríbete a nuestro blog, vía Email o RSS; además puedes seguirnos a través de nuestras redes sociales como: Facebook, Twitter, y Google+.
¿Conoces una forma más óptima de realizar el anterior procedimiento?, no dudes en compartir tu conocimiento con todos nuestros amigos de la web.
Si te fue de gran ayuda esta información, no olvides compartirla con tus amigos y en las redes sociales.
Si tienes dudas o sugerencias al respecto; puedes dejarnos tus comentarios.
Bendiciones...
como puedo añadirle 2 acciones a un mismo boton...
ResponderBorrarSaludos estimado visitante, sólo debes seguir los mismos pasos que te explicamos en este artículo tanto para agregar el primer como el segundo evento.
BorrarSi tienes inconvenientes; por favor, especifícame qué tipo de acciones quieres asignar al botón (JButton).
¡CRISTO TE AMA!
Bendiciones...
La pregunta es como hago para que según la opción que seleccione el usuario en la lista desplegable, luego le da al botón aceptar y el evento que debe realizar es cambiar el titulo de la ventana por la opción que selecciono el usuario en la lista
Borrarpublic class Vent_Flores extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private JComboBox N_Flores= new JComboBox();
private JButton btnAceptar = new JButton("Aceptar");
private JButton btnSalir = new JButton("Salir");
public Vent_Flores() {
super("Flores");
setSize(550,450);
JPanel L_flores = new JPanel();
// GridLayout gl= new GridLayout(2,1);
L_flores.setLayout(new FlowLayout());
// creo la etiqueta
JLabel etiqueta= new JLabel("Flores");
//creo los item de la lista desplegable
JComboBox N_Flores= new JComboBox();
N_Flores.addItem("Rosa");
N_Flores.addItem("Orquidea");
N_Flores.addItem("Girasol");
N_Flores.addItem("Cayena");
N_Flores.addItem("Lirio");
L_flores.add(etiqueta);
L_flores.add(N_Flores);
// creo el panel de botones
JPanel Botones= new JPanel();
Botones.setLayout(new FlowLayout());
// creo los botones
btnAceptar = new JButton("Aceptar");
btnAceptar.addActionListener(this);
btnAceptar.setActionCommand("Aceptar");
btnSalir = new JButton("Cancelar");
btnSalir.setActionCommand("Cancelar");
btnSalir.addActionListener(this);
// los añado al panel de botones
Botones.add(btnAceptar);
Botones.add(btnSalir);
// creo el panel principal
Container cp= getContentPane();
cp.add(Botones,BorderLayout.SOUTH);
cp.add(L_flores,BorderLayout.CENTER);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnAceptar ) {
this.setTitle((String) N_Flores.getSelectedItem());
} else if (e.getSource() == btnSalir) {
System.exit(0);
}
}
public static void main(String args[]) {
Vent_Flores n = new Vent_Flores();
n.setVisible(true);
}
}
Gracias por esa buena explicacion y el ejemplo que compartes, me a ayudado a entender un poco más sobre el tema.
ResponderBorrarMe gustaria hacerte una pregunta:
Como harías para llamar no un Jframe sino un JDialog (dentro de un HFrame padre) o un JInternalFrame (dentro de un contenedor) desde el evento del botón, y que este a su vez se comunique con el coordinador y todas las clases?
Es que e intentado hacerlo como lo explicas y no funciona. Agradezco de antemano tu ayuda. Muchas Gracias.