2010-05-31 6 views
0

J'essaye de fermer un cadre mais j'ouvre une nouvelle image.Comment fermer un cadre et ouvrir un nouveau cadre? (revisité)

Mon application a la page A, un JPanel avec quelques contrôles et un bouton spécifique, et quand l'utilisateur clique sur le bouton, je veux que la page A disparaisse et la page B apparaisse (page B a des contrôles qui dépendent des choix sont faits par l'utilisateur à la page A).

This has been asked before, mais il n'y avait pas de réponse satisfaisante. Dans l'implémentation de ActionListener, à savoir public void ActionPerformed(ActionEvent e) de ma classe jpanelForPageA, je peux écrire confortablement this.setVisible(false), mais comment puis-je mettre la page B dans un état visible?

+1

'jpanelForPageB.setVisible (true)'? – aioobe

Répondre

1

Vous pouvez faire le retrait du panneau, puis une l'addition du tour du panneau b. Une autre consiste à utiliser un CardLayout.

Lorsque vous créez vos panneaux, vous les ajoutez à un contenant JPanel que vous initialisez avec un CardLayout:

JPanel container = new JPanel(new CardLayout()); 
containter.add(getPanelA(), "PANEL_A"); 
containter.add(getPanelB(), "PANEL_B"); 

Ensuite, dans votre actionPerformed, lorsque vous voulez montrer panelB, vous faites ceci:

CardLayout cl = (CardLayout) container.getLayout(); 
cl.show("PANEL_B"); 

Jetez un oeil à this tutorial pour plus d'idées.

+0

Oh, c'est intéressant. Cette méthode semble tellement plus efficace que celle que j'ai décrite pour cette question. +1: D – exodrifter

0

Pour une raison quelconque, je ne peux jamais obtenir setVisible() pour que je fasse ce que vous décrivez. Au lieu de cela, je fais ceci:

frame.remove(panelA); 
frame.add(panelB); 

« frame » est juste le JFrame que vous voulez mettre les panneaux Essayez ceci si la méthode setVisible() ne fonctionne pas :)

à votre question initiale. , tout ce que vous avez à faire est (comme aioobe dit):

panelB.setVisible(true); 

((BTW, affichant une partie de votre code me aiderait à comprendre ce que vous essayez de demander))

Et cela est juste une supposition quant à quoi yo J'essaie de faire - je suppose que vos JPanels sont dans des classes différentes. Ensuite, vous aurez besoin de faire ceci:

class pages extends JFrame implements ActionListener 
{ 
    public pages() 
    { 
     panelA a = new panelA(this) 
    } 

    changeToA(panelB b) 
    { 
     remove(panelB); 
     add(new panelA(this)); 
    }   

    changeToB(panelA a) 
    { 
     remove(panelA); 
     add(new panelB(this)); 
    } 
} 

class panelA extends JPanel implements ActionListener 
{ 
    pages p; 
    public panelA(pages p) 
    { 
     this.p = p 
    } 
    // all that actionlistener code stuff 
     p.changeToB(this); 
} 

class panelB extends JPanel implements ActionListener 
{ 
    pages p; 
    public panelB(pages p) 
    { 
     this.p = p 
    } 
    // all that actionlistener code stuff 
     p.changeToA(this); 
} 

Vous passez la classe pages aux panneaux de sorte que les panneaux peuvent dire à la classe des pages de se retirer. ((je ne sais pas s'il y a un moyen plus facile, mais c'est ce que je fais tout le temps))

J'espère aidé :)

0

Vous devez supprimer le panneau A du cadre, ajouter le panneau B au cadre et appeler invalider sur le cadre (ou le panneau contenant). Au moins dans Swing, je ne suis pas sûr de AWT, là vous pourriez avoir besoin de repeindre ou de revalider au lieu d'invalider.

Vous pouvez aussi simplement créer un tout nouveau JFrame et disposer le panneau contenant un A.