Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Escuchar un boton desde una clase externa

Hola, quiero hacer un componente externo para poder poner en la barra de swing.
Lo primero que quiero hacer es que escuche desde una clase externa para luego ponerlo dentro de un jar. Pero primero desde una clase externa del mismo paquete.
Para ello, he creado tres clases:

BarraSuperior.java(declaro los 3 botones dentro de un jpanel)
Prueba.java(llamo a VentantaInciio)
VentanaInicio.java(Creo otro JPanel donde meto la barra y un boton más para pruebas)

BarraSuperior
-----------------------
package pruebapablo;

import java.awt.Color;
...
public class BarraSuperior extends javax.swing.JPanel implements ActionListener {
private PropertyChangeSupport changes = new PropertyChangeSupport(this);


/** Creates new form BarraSuperior */
public JPanel panel;
public JButton botonAfegeix;
public JButton botonModificar;
public JButton botonEliminar;

public BarraSuperior() {
initComponents();
panel=new JPanel();
this.add(panel);
panel.setSize(200, 200);
panel.setBackground(Color.red);

botonAfegeix = new JButton("Añadir");
botonModificar = new JButton("Modificar");
botonEliminar = new JButton("Eliminar");

panel.add(botonAfegeix);
panel.add(botonModificar);
panel.add(botonEliminar);
botonAfegeix.addActionListener(this);
botonModificar.addActionListener(this);
botonEliminar.addActionListener(this);
botonAfegeix.setActionCommand("Boton1");
botonModificar.setActionCommand("Boton2");
botonEliminar.setActionCommand("Boton3");

}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

}
public void actionPerformed(ActionEvent ae) {
System.out.println("Se ha hecho click en el botón");
changes.firePropertyChange("boton", true, true);

JOptionPane.showMessageDialog(null, ae.getActionCommand());

}
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}

Prueba
-----------

package pruebapablo;


public class Prueba {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
VentanaInicio ventana= new VentanaInicio();
ventana.setVisible(true);
}
}

VentanaInicio
------------------------
package pruebapablo;

import java.awt.BorderLayout;
...

public class VentanaInicio extends javax.swing.JFrame implements ActionListener, PropertyChangeListener {

/** Creates new form VentanaInicio */
private BarraSuperior barra;


public VentanaInicio() {
initComponents();

this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,400);
this.setVisible(true);
this.setLayout(new BorderLayout());
this.setTitle("Mi Ventana");
this.setBackground(Color.BLUE);
barra = new BarraSuperior();
JPanel panelSuperior = new JPanel();


this.getContentPane().add(panelSuperior);
panelSuperior.setSize (60, 30);
panelSuperior.add(barra);
JButton boton = new JButton("Prueba");
panelSuperior.add(boton);
boton.addActionListener(this);
boton.setActionCommand("Boton");




}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 300, Short.MAX_VALUE)
);
pack();
}
// </editor-fold>

public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new VentanaInicio().setVisible(true);
}
});
}
// Variables declaration - do not modify
// End of variables declaration

public void actionPerformed(ActionEvent ae) {

if (ae.getActionCommand().equals("Boton")){
JOptionPane.showMessageDialog(null, "boton de fuera");

}else if (ae.getActionCommand().equals("Boton1")){
JOptionPane.showMessageDialog(null, "boton 1");
}
JOptionPane.showMessageDialog(null, ae.getActionCommand());
/**
Object source = ae.getSource();
if (source == boton)
{
lCenter.setText("selected About item");
}
else if (source == languageitemES){

}
*/
System.out.println("Se ha hecho click en el botón desde la ventanaPral");
}

@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Hola");
}

}

Cuando ejecuto el programa, me sale un JPanel de color rojo con 3 botones, de la clase que he creado BarraSuperior y a la derecha otro boton, de la clase VentnaIncio. Si doy a los botones de la clase BarraSuperior, me responde los ActionListener de la BarraSuperior, y yo creo que los atienda el ActionListener de la VentanaInicio.
He intentado pasar valores con PropertyChangeListener pero no he conseguido nada.
¿Alguien sabe como puedo hacer esto?
Saludos y gracias.

mayo 8, 2014 | Registered Commenterbosquito

Los fire debe hacerlos el componente:

changes.firePropertyChange("boton", true, true); // incorrecto

Es así como debe hacerse:
BarraSuperior.this.firePropertyChange("boton", true, true);

Todo esto sobra, porque el propio componente ya implementa el PropertyChangeListener

private PropertyChangeSupport changes = new PropertyChangeSupport(this);

}
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}

mayo 8, 2014 | Registered Commenterchoces

choces, gracias por responder.
Como hago para que la clase VentanaInicio recoja si se ha pulsado el boton o no?
Saludos y gracias.

mayo 8, 2014 | Registered Commenterbosquito

Estoy un poco descolocado, lo siento...
Entiendo que el firePropertyChange es el disparador de el evento en el componente, y lo tiene que escuchar a través de lo que definas en propertyChange en la clase que escucha. ¿Es así? Saludos y gracias.

mayo 8, 2014 | Registered Commenterbosquito

En esa clase VentanaInicio tienes declarado el propertyChange, que recoge los eventos: pero solo de instancias de esta misma clase.
Debes añadir:

barra.addPropertyChangeListener(new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
String etiqueta = evt.getPropertyName();
System.out.println("Hola desde el botón");
}
});


Puesto que los lanzas con una etiqueta ("boton"), puedes saber que componente lo ha lanzado, leyendo la etiqueta:

String etiqueta = evt.getPropertyName(); // "boton" en tu caso

mayo 8, 2014 | Registered Commenterchoces

Lo siento, pero no me sale, no se que hago o pongo mal. Al final lo he dejado así:

BarraSuperior
-------------------------------------------

package pruebapablo;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
*
* @author pablo
*/

public class BarraSuperior extends javax.swing.JPanel implements ActionListener {
private PropertyChangeSupport changes = new PropertyChangeSupport(this);


/** Creates new form BarraSuperior */
public JPanel panel;
public JButton botonAfegeix;
public JButton botonModificar;
public JButton botonEliminar;

public BarraSuperior() {
initComponents();
panel=new JPanel();
this.add(panel);
panel.setSize(200, 200);
panel.setBackground(Color.red);

botonAfegeix = new JButton("Añadir");
botonModificar = new JButton("Modificar");
botonEliminar = new JButton("Eliminar");

panel.add(botonAfegeix);
panel.add(botonModificar);
panel.add(botonEliminar);
botonAfegeix.addActionListener(this);
botonModificar.addActionListener(this);
botonEliminar.addActionListener(this);
botonAfegeix.setActionCommand("Boton1");
botonModificar.setActionCommand("Boton2");
botonEliminar.setActionCommand("Boton3");

}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

}

public void actionPerformed(ActionEvent ae) {
BarraSuperior.this.firePropertyChange("botoncito", true, true);
}

}

VentanaInicio
-------------------------------------

package pruebapablo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
*
* @author pablo
*/
public class VentanaInicio extends javax.swing.JFrame implements ActionListener, PropertyChangeListener {

/** Creates new form VentanaInicio */
public BarraSuperior barra;


public VentanaInicio() {
initComponents();

//this.setLayout(BorderLayout());
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,400);
this.setVisible(true);
this.setLayout(new BorderLayout());
this.setTitle("Mi Ventana");
this.setBackground(Color.BLUE);
barra = new BarraSuperior();
JPanel panelSuperior = new JPanel();


this.getContentPane().add(panelSuperior);
panelSuperior.setSize (60, 30);
panelSuperior.add(barra);
JButton boton = new JButton("Prueba");
panelSuperior.add(boton);
boton.addActionListener(this);
boton.setActionCommand("Boton");



}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 300, Short.MAX_VALUE)
);
pack();
}
// </editor-fold>

public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new VentanaInicio().setVisible(true);
}
});
}

public void actionPerformed(ActionEvent ae) {


if (ae.getActionCommand().equals("Boton")){

}else if (ae.getActionCommand().equals("Boton1")){
JOptionPane.showMessageDialog(null, "boton 1");
}
JOptionPane.showMessageDialog(null, ae.getActionCommand());
System.out.println("Se ha hecho click desde dentro " + ae.getActionCommand());
}


@Override
public void propertyChange(PropertyChangeEvent evt) {

barra.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String etiqueta = evt.getPropertyName();
System.out.println("Hola desde el botón del cuadro rojo " + etiqueta);
}
});
System.out.println("Hola");
}

}

Supongo que el addPropertyChangeListener lo he puesto donde no toca, pero lo he probado de poner en todos los sitios, pero nunca hace caso... Nunca me aparecen los textos de esta parte. ¿Puede que vaya en otro sitio?. Saludos y gracias por la paciencia con este novato.

mayo 8, 2014 | Registered Commenterbosquito

El código que publiqué más arriba tienes que añadirlo después de la creación de la barra, dentro del constructor de la clase, no dentro de otro evento:

barra = new BarraSuperior();
barra.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String etiqueta = evt.getPropertyName();
System.out.println("Hola desde el botón del cuadro rojo " + etiqueta);
}
});

mayo 8, 2014 | Registered Commenterchoces

Hola, prueba superada, jeje.
Muchas gracias choces por tu tiempo.
Ya está, y como me ha costado mucho porque soy demasiado novato, dejo el código que funciona por si algun otro novato se atasca como me atasqué yo.

El prueba.java no se ha modificado osea que no lo vuelvo a pegar.

BarraSuperior.java
---------------------------------------------------------------------------------------------------------

package pruebapablo;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
*
* @author pablo
*/

public class BarraSuperior extends javax.swing.JPanel implements ActionListener, Serializable {
//Este objeto mantiene una lista de oyentes del cambio de propiedad y lanza eventos de cambio de propiedad
//explicación de Propiedades compartidas en: www.programacion.com/articulo/beans_basico_110/10
private PropertyChangeSupport changes = new PropertyChangeSupport(this);


/** Creates new form BarraSuperior */
public JPanel panel;
public JButton botonAfegeix;
public JButton botonModificar;
public JButton botonEliminar;

public BarraSuperior() {
initComponents();
panel=new JPanel();
this.add(panel);
panel.setSize(200, 200);
panel.setBackground(Color.red);

botonAfegeix = new JButton("Añadir");
botonModificar = new JButton("Modificar");
botonEliminar = new JButton("Eliminar");

panel.add(botonAfegeix);
panel.add(botonModificar);
panel.add(botonEliminar);
botonAfegeix.addActionListener(this);
botonModificar.addActionListener(this);
botonEliminar.addActionListener(this);
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

}
// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration

public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}

public void actionPerformed(ActionEvent ae) {
//System.out.println("Se ha hecho click en el botón");
if (ae.getSource() == botonAfegeix) changes.firePropertyChange("botonAfegeix", true, false);
if (ae.getSource() == botonModificar) changes.firePropertyChange("botonModificar", true, false);
if (ae.getSource() == botonEliminar) changes.firePropertyChange("botonEliminar", true, false);
//BarraSuperior.this.firePropertyChange("botonAfegeix", true, false);

}

}


VentanaInicio.java
---------------------------------------------------------------------------------------------------------

package pruebapablo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
*
* @author pablo
*/
public class VentanaInicio extends javax.swing.JFrame implements ActionListener, PropertyChangeListener, Serializable {

/** Creates new form VentanaInicio */
public BarraSuperior barra;
public String etiqueta;
public PropertyChangeEvent evt;

public VentanaInicio() {
initComponents();

//this.setLayout(BorderLayout());
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,400);
this.setVisible(true);
this.setLayout(new BorderLayout());
this.setTitle("Mi Ventana");
this.setBackground(Color.BLUE);
barra = new BarraSuperior();
barra.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
etiqueta = evt.getPropertyName();
System.out.println("Hola desde el botón del cuadro rojo " + etiqueta);
}
});

JPanel panelSuperior = new JPanel();


this.getContentPane().add(panelSuperior);
panelSuperior.setSize (60, 30);
panelSuperior.add(barra);
JButton boton = new JButton("Prueba");
panelSuperior.add(boton);
boton.addActionListener(this);
boton.setActionCommand("Boton");

}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 300, Short.MAX_VALUE)
);
pack();
}
// </editor-fold>

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(VentanaInicio.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new VentanaInicio().setVisible(true);
}
});
}
// Variables declaration - do not modify
// End of variables declaration

public void actionPerformed(ActionEvent ae) {
etiqueta=ae.getActionCommand();
System.out.println("Se ha hecho click desde dentro " + etiqueta + " " + ae.getActionCommand() );
}


@Override
public void propertyChange(PropertyChangeEvent evt) {
etiqueta = evt.getPropertyName();
System.out.println("Hola " + etiqueta);
}

}

mayo 9, 2014 | Registered Commenterbosquito