2009-06-03 9 views
14

Je veux un comportement similaire à celui par ex. Firefox où la liste des onglets disponibles n'apparaît que si au moins deux onglets existent.Est-il possible de masquer la barre d'onglets de JTabbedPane si un seul onglet existe?

Je n'ai pas encore trouvé quelque chose comme ça.

La meilleure idée que j'avais été en train de changer la mise en page manuellement:

  • en cas d'un composant, il suffit d'ajouter que le panneau entourant
  • si un composant est ajouté, retirer le composant du panneau entourant , ajoutez plutôt un JTabbedPane et ajoutez le précédent et le nouveau composant à ce volet.
  • Si un composant est supprimé et qu'un seul composant reste dans le volet, supprimez le volet et ajoutez le composant contenu à la place.

Bien que cela fonctionnerait probablement il se sent comme un hack ou solution de contournement ...

une autre idée?

Une solution devrait idéalement fonctionner à la fois dans Java 1.5 et 1.6 ... mais je serais heureux d'une solution de 1.6 seulement, aussi.

Répondre

5

Je crois que vous devrez le faire manuellement. Apparemment it has been done before, mais seulement comme un petit morceau d'un système qui semble ne pas être disponible.

Votre approche me semble bonne. Je le ferais comme vous l'avez fait, et enveloppez toute cette logique dans un JComponent personnalisé afin qu'il se sentira moins hackish.

+0

Je vais attendre un peu plus longtemps pour voir si quelqu'un a une idée brillante avant de vérifier la réponse ... – Huxi

+0

Je suis d'accord avec @mmyers. Si quelqu'un a un composant prédéfini pour le faire, je serais à peu près certain que cela a fonctionné de cette façon. – banjollity

+0

Merci, je suppose qu'il n'y a vraiment aucun autre moyen ... – Huxi

5

Vous pouvez être mieux en utilisant simplement CardLayout.

+0

Bonne idée générale mais je veux avoir un JTabbedPane incl. les différents regards concernant PLAF. Quoi qu'il en soit, votre contribution est appréciée. – Huxi

+0

+1 pour ceci est ce que j'aurais fait – willcodejavaforfood

+0

Simplement jTabbedPane1.setLayout (new CardLayout()); +50! –

1

Une autre option serait de personnaliser le délégué L & F (BasicTabbedPaneUI ou WindowsTabbedPaneUI en fonction des plates-formes qui vous intéressent) utilisé par JTabbedPane. Cela vous permettrait de personnaliser le comportement du volet à onglets dans le cas où un seul onglet était affiché.

Ceci est une autre façon de faire les choses mais je dirais que c'est une entreprise et faire ce que Michael a dit que vous obtiendrez où vous voulez aller avec beaucoup moins d'effort. Je voulais juste afficher ceci comme une réponse au cas où vous n'étiez pas au courant de cette option.

1

Je pense que cela peut être réalisé en utilisant la barre d'onglets et une mise en page de la carte,

  • ajouter la barre d'onglets et la présentation de la carte à une mise en page de sac de grille afin qu'ils Redimensionner automatiquement
  • la hauteur max de la barre d'onglet doit être la hauteur de l'onglet
  • ajouter un écouteur à la barre d'onglets de sorte que lorsque certains onglets sont cliqués il basculera la mise en page de la carte pour afficher le contenu approprié
  • cacher la barre d'onglets si elle n'a qu'une seule onglet

et cela devrait faire le travail.

11

Vous pouvez remplacer la méthode de l'interface utilisateur qui calcule la hauteur de la zone du bouton onglet, forçant la hauteur à 0 quand il n'y a qu'un seul onglet:

tabbed_pane.setUI(new BasicTabbedPaneUI() { 
    @Override 
    protected int calculateTabAreaHeight(int tab_placement, int run_count, int max_tab_height) { 
     if (tabbed_pane.getTabCount() > 1) 
      return super.calculateTabAreaHeight(tab_placement, run_count, max_tab_height); 
     else 
      return 0; 
    } 
}); 
+1

Cela fonctionne, mais j'avais une fine bordure supérieure colorée sur mon TabbedPane qui a été omise dans la zone où se trouvait l'onglet. Essayer un peu et faire presque le même remplacement pour 'paintTabBorder' et 'paintTabBackground' a résolu le problème. – zoidbeck

Questions connexes