2010-04-21 4 views
0

im créer une fonction de recherche pour une base de données utilisant un onglet jtabbed avec un onglet pour une recherche rapide et un pour une recherche avancée. la recherche avancée a un peu plus de champs, donc elle doit être plus grande, mais je ne veux pas que toute la fenêtre soit toujours à la plus grande taille pour des raisons esthétiques. J'ai ajouté un écouteur de changement au volet, et j'ai essayé de redimensionner le volet en fonction de l'onglet, et le code s'exécute lorsque l'on clique sur l'onglet, mais ne fait rien. ive a essayé d'utiliser tabbedSearchPane.setSize() suivi de tabbedSearchPane.validate(), ainsi que de redimensionner les composants autour de lui en utilisant setSize + validate, et rien ne semble faire quoi que ce soit. J'ai juste besoin de savoir comment changer la taille d'un jtabbedpane.jtabbedpane différents onglets de taille

Répondre

1

Comme décrit dans Preferred Size in Tabs, et comme vous l'avez observé, JTabbedPane essaie très dur de s'adapter à la plus grande vitre. Pour passer de la plus grande à la plus petite, vous devez remplacer la plus grande fenêtre par une plus temporaire ayant la même taille que la plus petite et invalidate() la fenêtre à onglets; l'inverse est nécessaire pour aller dans l'autre sens. C'est un combat. Vous pouvez également utiliser CardLayout, mentionné here. Comme vous voudrez redimensionner le conteneur englobant, notez comment ce example associé utilise pack() en conséquence.

+0

Ceci est la meilleure explication du comportement que j'ai trouvé sur le SO. Quand vous dites 'invalidate()' est ce qu'on appelle 'tabLarge.Invalidate()' quand vous changez? J'ai du mal à penser comment faire ça. – Pureferret

+0

Non 'invalidate()' indique simplement que le conteneur doit être mis en page sur 'validate()' ou 'pack()'. – trashgod

+0

Donc, je dois supprimer le contenu des autres onglets, et remplacer par un panneau temporaire vide quand je change? Comment obtenez-vous ce genre de comportement ... changeListener? – Pureferret

0

J'ai résolu ce problème sans problème. (Ma fenêtre à onglets est héritée dans un autre panneau, si elle joue un rôle)

tabbedPane.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       switch (tabbedPane.getSelectedIndex()) { 
       case 0: 
        tabbedPane.setPreferredSize(new Dimension(1, 230)); 
        break; 
       case 1: 
        tabbedPane.setPreferredSize(new Dimension(1, 330)); 
        break; 
       case 2: 
        tabbedPane.setPreferredSize(new Dimension(1, 430)); 
        break; 
       } 
      } 
     }); 

et bien sûr quand je crée mon JTabbedPane:

tabbedPane.setPreferredSize(new Dimension(1, 230)); 

Je repeindre-revalider les deux jtabbed/parentpanel à la fois après ceci, mais pour d'autres raisons ... Cela semble fonctionner sans même appeler repain/revalider dans aucun des panneaux.

Aperçu (Bordure rouge = autre panneau)

enter image description here

Questions connexes