|
Pestañas |
Anterior | Siguiente |
En otra sección del Tutorial se introduce el controlador de posicionamiento de Componentes CardLayout, y se explica y muestra cómo puede manejar diferentes fichas o tarjetas. No es un mal diseño, pero Swing introduce algo mucho más interesante y flexible, el JTabbedPane, que puede manejar directamente todas las fichas, a base de pestañas y permite cambiar a cualquiera de ellas. El contraste entre el CardLayout y el JTabbedPane es impresionante. El siguiente ejemplo java1418.java, se aprovecha de algunos de los ejemplos anteriores para poder implementar los diferentes paneles. Todos se construyen como descendientes de JPanel, así que en el programa se colocará cada uno de los ejemplos anteriores en su propio panel dentro del JTabbedPane. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; public class java1418 extends JPanel { static Object objetos[][] = { { "AWT-Clon",java1401.class }, { "Bordes",java1402.class }, { "Botones",java1404.class }, { "Grupo de Botones",java1406.class }, { "Listas y Combo",java1407.class }, { "Barras",java1413.class }, { "Arbol",java1414.class }, { "Tabla",java1416.class }, }; static JPanel creaPanel( Class clase ) { String titulo = clase.getName(); titulo = titulo.substring( titulo.lastIndexOf('.') + 1 ); JPanel panel = null; try { panel = (JPanel)clase.newInstance(); } catch( Exception e ) { System.out.println( e ); } panel.setBorder( new TitledBorder( titulo ) ); return( panel ); } public java1418() { setLayout( new BorderLayout() ); JTabbedPane pestana = new JTabbedPane(); for( int i=0; i < objetos.length; i++ ) { pestana.addTab( (String)objetos[i][0], creaPanel( (Class)objetos[i][1] ) ); } add( pestana,BorderLayout.CENTER ); pestana.setSelectedIndex( objetos.length/2 ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); frame.getContentPane().add( new java1418(),BorderLayout.CENTER ); frame.setSize( 460,350 ); frame.setVisible( true ); } } Se ha utilizado un array para la configuración: el primer elemento es el objeto String que será colocado en la pestaña y el segundo corresponde al objeto de la clase JPanel que será presentado dentro del correspondiente Panel. En el constructor del ejemplo se puede observar que se utilizan los dos métodos importantes del JTabbedPane: addTab() que crea una nueva pestaña y setSelectedIndex() que indica el panel que se va a presentar en primer lugar al arrancar el programa; en este caso se selecciona uno de en medio para mostrar que no es necesario comenzar siempre por el primero. La figura siguiente reproduce esta ventana inicial, en la que aparecen las barras de desplazamiento al igual que se ilustraba uno de los ejemplos anteriores de este capítulo. En la llamada al método addTab() se le proporciona la cadena que debe colocar en la pestaña y cualquier Componente del AWT. No es necesario que sea un JCompomponent, sino cualquier Componente del AWT, entre los cuales se encuentra, evidentemente, el JComponent, que deriva del Component del AWT. El Componente se presentará sobre el panel y ya no será necesario ningún control posterior, el JTabbedPane se encarga de todo. El trozo más interesante del código del ejemplo es el correspondiente al método creaPanel() que coge el objeto Class de la clase que se quiere crear y utiliza el método newInstance() para crear uno, moldeándolo a JPanel; desde luego, esto asume que la clase que se quiere añadir debe heredar de JPanel, sino no serviría de nada. Añade un TitledBorder que contiene el nombre de la clase y devuelve el resultado como un JPanel para que sea utilizado en addTab(). static JPanel creaPanel( Class clase ) { String titulo = clase.getName(); titulo = titulo.substring( titulo.lastIndexOf('.') + 1 ); JPanel panel = null; try { panel = (JPanel)clase.newInstance(); } catch( Exception e ) { System.out.println( e ); } panel.setBorder( new TitledBorder( titulo ) ); return( panel ); } |
|