2011-06-25 32 views
7

tengo una clase que se extiende JFrame, y tiene un BorderLayout. Tiene dos variables de instancia privadas de tipo JPanel. Representan paneles de botones y se llaman flipButton y confidenceButtons. Cuando hace clic en el botón, el panel de botones es reemplazado por el otro panel de botones. Es decir, si hace clic en un botón en flipButton, flipButton se reemplaza por trustButtons. Traté de hacerlo de esta manera:JPanel Sustitución con JPanel en un JFrame

 
    private class FlipListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     remove(flipButton); 
     add(confidenceButtons,BorderLayout.SOUTH); 
     validate(); 
     ... 
    } 
    } 
    private class ColorListener implements ActionListener{ 
    ... 
    public void actionPerformed(ActionEvent e){ 
     ... 
     remove(confidenceButtons); 
     add(flipButton,BorderLayout.SOUTH); 
     validate(); 
    } 
    } 

Los botones de flipButton tener FlipListeners y los de confidenceButtons tener ColorListeners. Cuando se ejecuta el programa, al hacer clic en un botón se eliminará el panel, pero no se agrega nada para reemplazarlo. ¿Qué estoy haciendo mal?

EDITAR

CardLayout resultó ser una solución simple y fácil. Resulta que el código anterior funciona; el problema era un error tipográfico en otra sección de mi código. >. < Sin embargo, siempre he tenido problemas para usar estos métodos, y CardLayout, me parece, me simplifica. Gracias.

Respuesta

6

Utilice un CardLayout, como se muestra here.

Game viewHigh Scores view

+0

También mi primer pensamiento. Cardlayout está diseñado para este caso de uso si es la mejor opción de mantenimiento. – extraneon

+0

Solución simple y funcionó como un encanto. ¡Gracias! – Shelley

5

revalidate() + repinte() debe ser truco, ejemplo here

EDIT:

piensa que ha conseguido problema con eso, ejemplos para que here y here y otra vez example by trashgod, se sienten libres para construir su pregunta basa en código de nuevo

otra manera es mirar ejemplo excelente añadido por Andrew Thompson :-) 1

+0

miré el ejemplo, pero no entiendo muy bien. ¿Por qué es necesario pintar ya que no estoy usando Graphics? ¿Llamaría a los tres métodos en TrustButtons? El ejemplo se ve muy específico y realmente no sé cómo adaptarlo a mi código. – Shelley

+0

1 Ver también esta [Ejemplo] (http://stackoverflow.com/questions/5812002/removeall-not-removing-at-next-validate/5812981#5812981). – trashgod

+0

ejemplo @Shelley es revalidate avourt + específicas de validación + vuelven a pintar, volver a pintar sobre questin(), en la mayoría de los casos interfaz gráfica de usuario funciona correctamente y no se requieren para pintar(); hmmm y no hay existe algún tutorial oscilación o describciones detalladas acerca de eso :-) – mKorbel

1

intentar usar getContentPane() para llamar a eliminar(), add() métodos ect ..:

getContentPane().remove(flipButton); 
getContentPane().add(confidenceButtons,BorderLayout.SOUTH); 
getContentPane().revalidate(); 
getContentPane().repaint(); 

Editar: trabajo este código abajo para mí:

import java.awt.BorderLayout; 
import java.awt.HeadlessException; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Frame extends JFrame { 
JPanel flipButton =new JPanel(); 
JPanel confidenceButtons =new JPanel(); 



    public Frame() throws HeadlessException { 
    super(); 
    this.setLayout(new BorderLayout()); 
    JButton b1=new JButton("flip"); 
    b1.addActionListener(new FlipListener()); 
    flipButton.add(b1); 

    JButton b2=new JButton("color"); 
    b2.addActionListener(new ColorListener()); 
    confidenceButtons.add(b2); 
    this.getContentPane().add(flipButton,BorderLayout.SOUTH); 
    this.setSize(250,250); 
    this.pack(); 
    this.setVisible(true); 

} 
    private class FlipListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      remove(flipButton); 
      add(confidenceButtons,BorderLayout.SOUTH); 
      validate(); 
      repaint(); 

     } 
     } 
     private class ColorListener implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 

      remove(confidenceButtons); 
      add(flipButton,BorderLayout.SOUTH); 
      validate(); 
      repaint(); 
     } 
     } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     new Frame(); 

    } 

} 
+0

si puede publicar su código de clase completo de JFrame, puedo intentar solucionarlo. tal vez intente usar otro diseño en lugar de Borederlayout. b/c BorderLayout a veces causa un comportamiento extraño – othman

+0

Creo que no debería importar. He leído que los métodos add, remove etc se agregan automáticamente al panel de contenido cuando se llaman solos, por lo que getContentPane() es innecesario. – Shelley

+0

Intenté usar CardLayout y funciona perfectamente ahora (CardLayout resultó ser una solución fácil). Gracias por tu ayuda. – Shelley