Question

J'essaie d'obtenir un JTabbedPane où tous les onglets (les onglets réels, et non les composants) ont la même largeur (soit la largeur minimale requise pour l'étiquette la plus large, soit une largeur constante).

J'ai essayé de remplacer BasicTabbedPaneUI.getTabBounds (int tabIndex, Rectangle dest) , mais apparemment, cette méthode n'est pas utilisée par les méthodes de peinture de BasicTabbedPaneUI , à la place il utilise un tableau rects pour déterminer la taille des onglets.

Ma prochaine approche consisterait à remplacer JTabbedPane.insertTab (titre de chaîne, icône, composant, astuce de chaîne, index int) et à définir la taille préférée du composant label. t semble très élégant et je ne suis même pas sûr que cela fonctionnerait du tout.

Y a-t-il un moyen d'y parvenir?

Était-ce utile?

La solution

La réponse est simple. Lorsque nous mettons le nom de l'onglet, il suffit de formater le nom en utilisant HTML. dire

tp - objet JTabbedPane

tp.addTab("<html><body><table width='150'>Name</table></body></html>",Componentobject)

Autres conseils

Je pense que ce n'est pas aussi compliqué que vous l'avez fait. Utilisez simplement setTabComponentAt () avec un JLabel sur lequel vous avez défini la taille préférée.

J'ai essayé les solutions suivantes:

tabPane.setUI(new javax.swing.plaf.metal.MetalTabbedPaneUI() {
    @Override
    protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) {
        return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight) + 12;
    }
});

Cela semble bien fonctionner pour moi. Mais si vous utilisez un L & F différent, vous finirez par le rendre avec le «métal», peu importe.

Je suppose que vous pouvez obtenir l'interface utilisateur par défaut et y créer une instance pour déterminer celle qui est utilisée et l'instancier en conséquence.

Par exemple:

TabbedPaneUI ui = tabPane.getUI();

if (ui instanceof WindowsTabbedPaneUI) {
    // Create the windows rendition
} else if (ui instanceof MetalTabbedPaneUI) {
    // Create the metal rendition
} else if (ui instanceof MotifTabbedPaneUI) {
    // Create the motif rendition
} else if (ui instanceof SynthTabbedPaneUI) {
    // Etc...
}

cela a fonctionné pour moi.

 JLabel lab = new JLabel();
        lab.setPreferredSize(new Dimension(200, 30));
        jTabbedPane1.setTabComponentAt(0, lab);  // tab index, jLabel

ou essayez cette modification pour tous les composants d'onglet de même taille (appelés dans la méthode principale)

UIManager.getLookAndFeelDefaults (). put ("TabbedPane: TabbedPaneTab.contentMargins", nouvelles insertions (10, 100, 0, 0));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top