rubensa.eu.org algo en qué pensar...

El contenido de este sitio es de libre distribución, siempre que se cite la fuente original. No está permitido su uso comercial sin previo aviso y si lo modifica o distribuye debe mantener esta licencia.

Inicio de sesión de usuario

9. Styles (estilos) y StyleSheets (hojas de estilo)

Como hemos visto, la apariencia visual y el comportamiento de un Component se puede configurar fijando las propiedades de cada instancia de Component.  Esta práctica se puede volver muy repetitiva cuando se trabaja con un número significativo de Components muy configurados.  Para aliviar este problema, Echo2 incluye "Styles" que pueden configurarse para fijar propiedades comunes y asignárselas a múltiples Components.

Creando Styles

Los estilos se definen usando el interfaz Style.  El interfaz Style en sí mismo solamente especifica unos pocos métodos para obtener valores de propiedades, esto es, getPropertyValue() y getIndexedPropertyValue().  La clase MutableStyle proporciona una implementación de Style que incluye el almacenamiento de propiedades y es adecuada para un uso de propósito general.  Aunque es posible crear tu propia clase de implementación de Style, normalmente es más facil crear objetos MutableStyle y asignarles propiedades.

Los Styles se pueden asignar a múltiples Components.  La fijación de un Style en un componente no afectará a los valores de las propiedades internas del Component; la información contenida en el Style solamente se usará para pintarlo.

El siguiente ejemplo muestra un Style usado por múltiples Components:

MutableStyle buttonStyle = new MutableStyle();
buttonStyle.setProperty( AbstractButton.PROPERTY_BACKGROUND, Color.GREEN);
buttonStyle.setProperty( AbstractButton.PROPERTY_BORDER, new Border(2, Color.GREEN, Border.STYLE_GROOVE));
buttonStyle.setProperty( AbstractButton.PROPERTY_ROLLOVER_ENABLED, Boolean.TRUE);
buttonStyle.setProperty( AbstractButton.PROPERTY_ROLLOVER_FOREGROUND, Color.BLUE);
Button button1 = new Button("Alpha");
button1.setStyle(buttonStyle);
parentComponent.add(button1);
Button button2 = new Button("Bravo");
button2.setBackground(Color.YELLOW);
button2.setStyle(buttonStyle);
parentComponent.add(button2);
CheckBox checkBox = new Button("Charlie");
checkBox.setStyle(buttonStyle);
parentComponent.add(checkBox);

Nombres de propiedades:  Los nombres de las propiedades usados en un estilo se puden epecificar usando constantes definidas en la clase Component para la que se utilizará el estilo.  Las constantes de nombre de propiedad siempre comenzarán con el prefijo "PROPERTY_" seguido del nombre de la propiedad, por ejemplo, PROPERTY_FOREGROUND o PROPERTY_BORDER.  Las propiedades que no tienen una constante con dicho prefijo, como "visible" o "locale" no se pueden definir usando Styles.

Componentes Objetivo:  El buttonStyle del ejempo de arriba está pensado para que sea usado en cualquier AbstractButton.  Por tanto, el Style se puede usar en cualquier descendiente de AbstractButton, como un Button o un CheckBox como en el ejemplo.

Precedencia de Propiedades:  Fíjate también que en el código que configura el button2, se asigna una propiedad directamente al Button.  Las propiedades asignadas directamente a un Component sobre-escribirán a las asignadas en el Style.  Por tanto, en el ejemplo de arriba, button2 se pintaría con color de fondo amarillo (yellow) (en vez de verde -green-).

StyleSheets

Un StyleSheet representa una conlección de objetos Style con nombre.  Se puede asignar un único StyleSheet a un ApplicationInstance.  Los Components registrados en esa ApplicationInstance podrán hacer referencia a los Styles usando identificadores basados en String.  El Component usa el método Component.setStyleName() para especificar un nombre de Style del StyleSheet.

Button button1 = new Button("Alpha");
button1.setStyleName("Default");

Declarando StyleSheets por Programa

Los StyleSheets se pueden crear programáticamente instanciando un MutableStyleSheet y asignándole Styles.  Cuando se añade un Style a un MutableStyleSheet se deben especificar el Component objetivo así como el nombre del estilo.  El siguiente código muestra cómo añadir Styles a un MutableStyleSheet:

MutableStyleSheet styleSheet = new MutableStyleSheet();
styleSheet.addStyle(AbstractButton.class, "Default", buttonStyle);
styleSheet.addStyle(AbstractButton.class, "Special", specialButtonStyle);
styleSheet.addStyle(TextComponent.class, "Login", loginFieldStyle);

Declarando StyleSheets con XML

Los StyleSheets se pueden definir completamente usando archivos XML.  El uso de esta característica se deja a decisión del desarrollador ya que, como hemos visto antes, si se desea se pueden crear StyleSheets completos sin usar XML.

Cargando StyleSheets XML:  Para cargar un StyleSheet desde un archivo XML, se utiliza la clase nextapp.echo2.app.componentxml.StyleSheetLoader.  Los distintos métodos load() de la clase se pueden usar para crear instancias de StyleSheet a partir de recursos del CLASSPATH o directamente desde un InputStream.  El siguiente ejemplo muestra la carga de un StyleSheet desde un recurso en el CLASSPATH y su almacenamiento en una constante estática:

public static final StyleSheet DEFAULT_STYLE_SHEET;
static {
try {
DEFAULT_STYLE_SHEET = StyleSheetLoader.load( "/echo2example/email/resource/style/Default.stylesheet", Thread.currentThread().getContextClassLoader());
}
catch (ComponentXmlException ex) {
throw new RuntimeException(ex);
}
}

Powered by Drupal - Design by rubensa based on abac theme by Artinet