2010-03-24 6 views
4

Je n'ai que JTabbedPane dans JFrame. JTabbedPane définit ses dimensions à la plus grande largeur/hauteur de la page. Étant donné que la taille des pages est différente, est-il possible de forcer JTabbedPane à modifier ses dimensions lors de la sélection d'une autre page?Comment rendre JTabbedPane autoresize pour s'adapter aux dimensions de la page?

http://grab.by/3hIg

haut est la façon dont il se comporte maintenant et un fond est comment je veux qu'il se comporte (i redimensionné cadre à la main)

Répondre

3

Ceci est assez simple. Il implique le calcul dynamique des différences entre les dimensions de vos pages et les utiliser pour forcer la taille préférée sur vous JTabbedPane. J'ai fait une expérience rapide et ça a marché. Donc, au lieu de mettre beaucoup de texte ici - voici le code. Ce n'est pas parfait mais vous devriez avoir une idée. Les questions sont les bienvenues, bien sûr.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

    private static int maxW = 0; 
    private static int maxH = 0; 

    public static void main(String[] args) { 


     final JFrame f = new JFrame(); 

     final JTabbedPane tabs = new JTabbedPane(); 

     tabs.add(createPanel(Color.RED, 100, 100), "Red"); 
     tabs.add(createPanel(Color.GREEN, 200, 200), "Green"); 
     tabs.add(createPanel(Color.BLUE, 300, 300), "Blue"); 

     final Dimension originalTabsDim = tabs.getPreferredSize(); 

     tabs.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 

       Component p = ((JTabbedPane) e.getSource()).getSelectedComponent(); 
       Dimension panelDim = p.getPreferredSize(); 

       Dimension nd = new Dimension(
         originalTabsDim.width - (maxW - panelDim.width), 
         originalTabsDim.height - (maxH - panelDim.height)); 

       tabs.setPreferredSize(nd); 

       f.pack(); 
      } 

     }); 

     f.setContentPane(tabs); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setLocationRelativeTo(null); 

     f.setVisible(true); 


    } 

    private static final JPanel createPanel(Color color, int w, int h) { 

     JPanel p = new JPanel(); 
     p.setBackground(color); 
     p.setPreferredSize(new Dimension(w, h)); 

     maxW = Math.max(w, maxW); 
     maxH = Math.max(h, maxH); 

     return p; 

    } 

} 
+0

Ok, cela fonctionne très bien (même avec scala-swing) mais est-ce possible de le faire sans régler la largeur et la hauteur du panneau? – teamon

+0

Paquets d'images à la taille préférée de son contenu. Vous pouvez avoir une page de contenu distincte (avec le volet à onglets intégré) et définir la dimension préférée à la place du volet à onglets lui-même, mais vous devez le définir à quelque chose. –

3

Je pense qu'une autre option est de modifier dynamiquement les panneaux de chaque onglet lorsque l'onglet est sélectionné:

  1. installer un écouteur sur JTabbedPane sélection
  2. installer un panneau vide sur chaque onglet, mais la onglet sélectionné par défaut (qui contient le panneau réel pour cet onglet)
  3. dans l'écouteur de sélection:
    • retirer le panneau de l'onglet sélectionné précédemment (par exemple, le remplacer par un panneau vide)
    • changer le panneau vide par le panneau réel dans l'onglet nouvellement sélectionné
    • d'appel pack() sur la fenêtre/dialogue contenant le JTabbedPane

Responsabilité: Je n'ai pas testé cette approche, mais je crois qu'il devrait fonctionner selon ce que vous voulez.

Veuillez également noter que la modification dynamique de la taille de la boîte de dialogue en fonction de l'onglet sélectionné n'est pas très conviviale du point de vue de l'interface graphique pure.

+0

Cela fonctionne réellement et c'est mieux que le code ci-dessus par eugener. Le code d'Eugen commence avec une fenêtre trop grande - il a la dimension de l'onglet bleu même si le bleu n'est pas visible mais le rouge. – xmjx

+0

@xmjx si cela fonctionne pourriez-vous le mettre dans une nouvelle réponse? J'ai du mal à voir comment faire cela à partir des instructions vagues ci-dessus. – Pureferret

0

Que pensez-vous de cela?

tabbedPane.addChangeListener(new ChangeListener(){ 

    @Override 
    public void stateChanged(ChangeEvent arg0) { 
     Component mCompo=tabbedPane.getSelectedComponent(); 
     tabbedPane.setPreferredSize(mCompo.getPreferredSize()); 
     BasicFrame.this.pack(); 
    } 
}); 
+0

Désolé, cela ne fonctionne pas parce que la taille est trop petite. – ben2613