2011-06-01 12 views
5

Tengo una sencilla GUI Swing con ventana principal JFrame y su panel principal deriva de JPanel. El panel tiene algunos botones en los que se puede hacer clic y generar eventos.Evento Swing-calling desde el panel interior

Quiero que estos eventos afecten a los datos almacenados en JFrame porque es mi aplicación principal, tiene algunas colas para el hilo, las secuencias abiertas, etc.

Entonces, ¿cómo hago que mi botón en el panel invoque devoluciones de llamada en su marco principal? ¿Cuál es la mejor práctica de esto para Java/Swing?

Respuesta

3

Para invocar métodos en el marco principal, necesita una referencia al marco padre. Así constructor de sus JPanel puede ser declarado como esto:

public MyPanel(MyFrame frame){ 
    super(); 
    this.frame = frame; 
    //the rest of your code 
} 

Y en el JFrame que invocar este constructor de esta manera:

panel = new MyPanel(this);//this refers to your JFrame 

En los controladores de eventos vinculados a los botones que ahora tienen acceso a la trama y puede invocar los diversos métodos según sea necesario.

button1.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      //do some stuff 
      frame.someMethod();//invoke method on frame 
      //do more stuff 
     } 
    }); 
1

Utilice el método addActionListener en los botones que desee, especificando la clase que implementa ActionListener.

ActionListenerClass actionListenerObject = new actionListenerClass(); 
JButton b = new JButton("Button"); 
b.addActionListener(actionListenerObject); 

public class ActionListenerClass implements ActionListener(){ 
//or better : actionListenerClass extends AbstractAction 
     public void actionPerformed(ActionEvent e) { 
     } 
} 

EDIT:

Sí, sé que esto. Pero el oyente de action quiero estar en los padres JFrame clase - este es el problema

continuación, se extiende la clase JFrame haciendo que la nueva clase derivada que implementa la interfaz deseada.

+0

Sí, lo sé. Pero el oyente de acción que quiero ser en la clase padre JFrame - * este es el problema * – zaharpopov

1

Eche un vistazo al tutorial this para usar SwingWorker.

+0

¿por qué me ayuda? Solo quiero acceder de forma limpia a JFrame desde JPanel que contiene – zaharpopov

+0

sry, no estaba claro. puede usar 'SwingUtilities.getWindowAncestor (JPanel)' para obtener la ventana primaria – oliholz

1

Puede implementar la ActionListener en su clase que tiene el JFrame (o lo extiende):

class MyPanelClass { 
    public MyPanelClass(ActionListener al) 
    { 
     //... 
     JButton myButton = new JButton("Button"); 
     myButton.addActionListener(al); 
     //... 
    } 
} 

class MainClass extends JFrame implements ActionListener { 
    public void someMethod() { 
     MyPanelClass mpc = new MyPanelClass(this); 
    } 

    @Override 
    public void ActionPerformed(ActionEvent ev) { 
     // your implementation 
    } 
} 
+0

Pero luego, tiene que demultiplexar todos los botones han llamado, ¿no? todos alcanzan la misma devolución de llamada 'actionPerformed'? – zaharpopov

+0

Eso es correcto. Y veo el problema del que estás hablando. Tal vez pasar el marco es una mejor opción ... – MByD

Cuestiones relacionadas