Domanda

Sto cercando di ottenere un JTabbedPane in cui tutte le schede (le schede effettive, non i componenti) hanno la stessa larghezza (o la larghezza minima necessaria per l'etichetta più ampia o una larghezza costante).

Ho provato a sostituire BasicTabbedPaneUI.getTabBounds (int tabIndex, Rectangle dest) , ma apparentemente questo metodo non è usato dai metodi di pittura di BasicTabbedPaneUI , invece utilizza un array rects per determinare la dimensione delle schede.

Il mio prossimo approccio sarebbe quello di sovrascrivere JTabbedPane.insertTab (titolo stringa, icona icona, componente componente, punta stringa, indice int) e impostare la dimensione preferita del componente etichetta, ma questo non ' Non mi sembra molto elegante e non sono nemmeno sicuro che funzionerebbe affatto.

C'è un modo per raggiungere questo obiettivo?

È stato utile?

Soluzione

La risposta è semplice. Quando inseriamo il nome per la scheda, basta formattare il nome usando html. dire

tp - oggetto JTabbedPane

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

Altri suggerimenti

Penso che non sia così complicato come hai fatto. Usa setTabComponentAt () con una JLabel su cui hai impostato la dimensione preferita.

Ho provato quanto segue:

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;
    }
});

Questo sembra funzionare bene per me. Ma se usi una L & amp; F diversa, finirai per renderla con il 'metal' indipendentemente.

Immagino che potresti ottenere l'interfaccia utente predefinita e fare una 'istanza' su di essa per determinare quale viene utilizzata e creare un'istanza di conseguenza.

Ad esempio:

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...
}

questo ha funzionato per me.

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

oppure prova questa modifica a tutti i componenti della scheda nelle stesse dimensioni (chiamati nel metodo principale)

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top