Schede con larghezza (costante) uguale in JTabbedPane
-
20-08-2019 - |
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?
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));