Pregunta

Estoy tratando de obtener un JTabbedPane donde todas las pestañas (las pestañas reales, no los componentes) tienen el mismo ancho (ya sea el ancho mínimo necesario para la etiqueta más ancha o un ancho constante).

He intentado anular BasicTabbedPaneUI.getTabBounds (int tabIndex, Rectangle dest) , pero aparentemente este método no es utilizado por los métodos de pintura de BasicTabbedPaneUI , en su lugar utiliza una matriz de rectificaciones para determinar el tamaño de las pestañas.

Mi próximo enfoque sería anular JTabbedPane.insertTab (título de cadena, icono de icono, componente de componente, punta de cadena, índice int) y establecer el tamaño preferido del componente de etiqueta, pero esto no funciona Parece muy elegante y ni siquiera estoy seguro de que funcione en absoluto.

¿Hay alguna manera de lograr esto?

¿Fue útil?

Solución

La respuesta es simple. Cuando ponemos el nombre de la pestaña, simplemente formatee el nombre usando html. decir

tp - Objeto JTabbedPane

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

Otros consejos

Creo que no es tan complicado como lo has hecho. Simplemente use setTabComponentAt () con un JLabel en el que haya establecido el tamaño preferido.

He intentado lo siguiente:

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

Esto parece funcionar bien para mí. Pero si usa una L & amp; F diferente, terminará renderizándola con el 'metal' independientemente.

Supongo que podría obtener la interfaz de usuario predeterminada y hacer una 'instancia de' para determinar cuál se está utilizando e instanciar en consecuencia.

Por ejemplo:

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

esto me funcionó.

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

o intente este cambio en todos los componentes de pestaña en los mismos tamaños (llamado en el método principal)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top