2009-07-11 4 views
2

J'ai deux panneaux que je souhaite afficher à l'utilisateur. J'ai décidé de les ajouter à un JTabbedPane. Je veux également permettre à l'utilisateur d'avoir une vue côte à côte d'eux tous les deux en même temps. J'ai donc ajouté les deux panneaux à mon JTabbedPane puis je créé un JSplitPanel en tant que tel:Quel est le problème avec JSplitPanel (ou JTabbedPane)?

tabs.addTab("Align Image Points", imageControlPanel); 
    tabs.addTab("Align Map Points", mapControlPanel); 
    JSplitPane splitPane = new JSplitPane(
      JSplitPane.HORIZONTAL_SPLIT, true, imageControlPanel, 
      mapControlPanel); 
    tabs.addTab("Side by side view", splitPane); 

Le JTabbedPane résultant n'a qu'un seul onglet! Quand je supprime le JSplitPane tout fonctionne bien. Deux onglets J'ai ensuite essayé de simplifier le problème pour poster ici et je suis venu avec ceci:

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JSplitPane; 
import javax.swing.JTabbedPane; 

public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Test"); 
     JButton b1 = new JButton("First"); 
     JButton b2 = new JButton("Second"); 
     JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,b1,b2); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("First", b1); 
     tabs.addTab("Second", b2); 
     tabs.addTab("Both", s); 
     f.getContentPane().add(tabs); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

Cela m'a donné un autre problème! Il affiche 3 onglets, mais le volet fractionné du troisième onglet n'affiche aucun bouton!

Donc, ma question est Qu'est-ce qui ne va pas avec JSplitPanel? Vous ne pouvez pas avoir des objets d'affichage qui sont déjà affichés dans un autre onglet? Cela n'a aucun sens. Aidez-moi, s'il vous plaît.

(Note: Je ne veux pas dupliquer les composants que je suis sur le point d'afficher comme je les veux être la même référence)

Répondre

1

J'ai eu le même problème que vous aviez. ce que j'avais résolu pour ce problème, j'ai fait chaque chaque GUI en tant que modèle MVC (Model-view-controller) ce contrôleur sait comment itératif avec les composants gui.

J'ai créé une nouvelle instance de GUI (View) sur chaque onglet, mais j'ai injecté la même instance de contrôleur pour cette GUI en tant que paramètre constructeur puisque le contrôleur sait comment gérer les flux et les comportements GUI.

par exemple,

GUIView1Controller controller1 = new GUIView1Controller(); 
    GUIView2Controller controller2 = new GUIView2Controller(); 

    // Add new instance GUI ; however , use the same instance of controller 
    JSplitPane s = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true, 
         new GUIView1(controller1), new GUIView2(controller2)); 

    JTabbedPane tabs = new JTabbedPane(); 
    tabs.addTab("First", new GUIView1(controller1)); 
    tabs.addTab("Second", new GUIView2(controller2)); 
    tabs.addTab("Both", s); 

GUIView1 et GUIView2 enregistrera tous les auditeurs de l'interface graphique au contrôleur, de sorte que le contrôleur sera informé et prendre une action pour les auditeurs. quel que soit l'onglet GUIView1 dans "First", l'onglet GUIView1 on "Both" est également mis à jour comme les mêmes comportements de GUIView1 dans l'onglet "First". L'inconvénient était que vous deviez créer une nouvelle instance de GUIView sur l'onglet et de JSplitPane; Cependant, le contrôleur peut contrôler et partager tous les événements et comportements gui.

J'espère que ça aide.

Tigre.

+0

Oui, j'aime l'idée de banjollity que vous pouvez ajouter "addChangeListener" sur l'onglet, vous pouvez seulement créer une instance de GUIView, et basé sur ce listeur de changement, vous pouvez changer les composants gui dans les deux sens. – Tiger

+0

Merci pour la réponse. Il semble correct (puisque vous avez résolu ce problème vous-même), mais j'ai trouvé une autre interface graphique pour mon programme qui est en fait mieux pour mon cas, donc je ne vais pas avoir besoin de mettre en œuvre cela. –

6

UIs Swing sont hiérarchiques et vous ne pouvez ajouter un composant à la hiérarchie une fois que. Si vous ajoutez un composant à plusieurs conteneurs, vous obtiendrez des résultats imprévisibles. Vous avez raison de ne pas vouloir dupliquer les composants, mais vous aurez besoin d'un écouteur sur JTabbedPane pour ajouter et supprimer chaque composant de l'onglet ou de JSplitView lorsque la sélection des onglets change.

tabs.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     // Reorganise the display based on the current tab selection. 
    } 
} 
Questions connexes