2009-12-22 3 views
2

J'ai une question concernant le codage d'une interface utilisateur Swing. Si je veux créer un logiciel avec une option, par exemple sur le premier cadre j'ai trois boutons (Nouveau, Option, Sortie).Java Swing design

Maintenant, si un utilisateur clique sur le nouveau bouton, je veux changer tout le contenu du cadre en quelque chose d'autre. Je sais que je dois utiliser addActionListener à ce bouton. Mais ma question est de savoir comment changer le contenu dans le cadre. Créer de nouveaux cadres, puis utiliser setVisible() n'est pas une option pour moi.

Et pour utiliser frame.remove() tous les objets semblent gênants si plusieurs éléments doivent être supprimés. Ou est-ce la bonne façon?

Répondre

5

Regardez dans le Card Layout. J'utiliserais probablement aussi des éléments de menu au lieu de boutons.

+0

frame.remove() n'est pas idéal. CardLayout est la bonne réponse. –

+1

Hey camickr , Je suis surpris que vous ne harceliez pas cette personne pour le SSCCE .... WOW !! – nn2

1

Vous pouvez utiliser frame.remove()

La différence est que vous pouvez retirer un panneau entier au lieu de supprimer « plusieurs » choses, et vous venez de remplacer par un nouveau panneau

frame.add(mainPanel); 
... 
// in the action listener 
frame.remove(mainPanel); 
frame.add(theNewPage); 

Le point est, vous n'avez pas à craindre de supprimer des choses gênantes dans le cadre principal, car vous devez placer toutes ces choses dans un seul panneau et ensuite simplement changer de panneau.

MISE À JOUR

J'ai fait le code nécessaire pour tester ce dont je parle.

Voici un exemple de fonctionnement:

alt text http://img190.imageshack.us/img190/5206/capturadepantalla200912p.png

plus tard

alt text http://img301.imageshack.us/img301/1368/capturadepantalla200912n.png

voici l'exemple de fonctionnement:

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

public class ChangePage { 
    JComponent mainPage; 
    JComponent newPage; 
    JFrame  frame; 

    public static void main(String [] args) { 
     ChangePage changePageDemo = new ChangePage(); 
     changePageDemo.show(); 
    } 
    private void show(){ 
     frame = new JFrame("Demo"); 
     frame.add(getMainPage()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
    private JComponent getMainPage() { 
     if(this.mainPage != null) { 
      return this.mainPage; 
     } 
     this.mainPage = new JPanel(new BorderLayout()); 
     mainPage.add(new JLabel("Choose an option")); 
     mainPage.add(new JPanel(){{ 
      add(new JButton("New"){{ 
       addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 
         SwingUtilities.invokeLater(new Runnable(){ 
          public void run(){ 
           frame.remove(getMainPage()); 
           frame.add(getNewPage()); 
           //frame.setContentPane(getNewPage()); 
           frame.pack(); 

          } 
         }); 
        } 
       }); 
      }}); 
      add(new JButton("Options")); 
      add(new JButton("Exit")); 
     }}, BorderLayout.SOUTH); 
     return this.mainPage; 

    } 
    private JComponent getNewPage() { 
     if(newPage != null) { 
      return newPage; 
     } 
     this.newPage = new JPanel(); 
     this.newPage.add(new JLabel("<html>This is the \"new\" page.<br> Do you like it?<br></html>")); 
     this.newPage.add(new JButton("Return"){{ 
      addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        SwingUtilities.invokeLater(new Runnable(){ 
         public void run(){ 
          frame.remove(getNewPage()); 
          frame.add(getMainPage()); 
          //frame.setContentPane(getMainPage()); 
          frame.pack(); 

         } 
        }); 
       } 
      }); 
     }}); 
     return this.newPage; 
    } 

} 

Sinon, vous pouvez utiliser setContentPane :)

+0

Qu'y a-t-il avec le downvote? – OscarRyz

+0

@Oscar - Vous avez probablement reçu un vote négatif dû au fait que frame.remove n'est pas la bonne façon de résoudre ce problème.Voir la réponse de camickr pour la bonne façon (CardLayout). Note: Je n'ai pas voté pour vous. – JasCav

+0

@Jason: Probablement. C'est bien, je veux dire, je pense que ce serait mieux si le downvoter explique ce qui ne va pas avec ma réponse. Juste pour comprendre. En fait, votre commentaire a un sens. – OscarRyz

5

CardLayout est en effet le meilleur choix dans ce cas; mais, lorsque l'occasion l'exige, un Component peut être retiré d'un Container en utilisant la méthode remove() ou removeAll(). Ensuite, l'étape essentielle est d'invoquer la méthode [validate()] (http://java.sun.com/javase/6/docs/api/java/awt/Container.html#validate())) pour redessiner les sous-composants du conteneur.L'exemple d'Oscar Reyes utilise la méthode Frame [pack()] (http://java.sun.com/javase/6/docs/api/java/awt/Window.html#pack()), héritée de Window) pour obtenir cet effet. example, la méthode resetGame() reconstitue le panneau d'affichage d'une manière similaire.

+1

+1 pour avoir référencé ma réponse :) – OscarRyz

+0

Bonnes illustrations! – trashgod

0

la façon la plus simple est d'utiliser un Tabbed Pane.