Download modelo - DBA.MX

Document related concepts
no text concepts found
Transcript
Técnicas avanzadas de programación
Aplicaciones
Ventanas de diálogo: introducción (I)
• Una dirección:
http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
• Para crear una ventana de diálogo hay que:
– Crear una clase que herede de JDialog (si además es un “escuchador de eventos”
implementar un “listener”):
public class DlgNuevo extends JDialog implements java.awt.event.ActionListener {
– Tener un constructor que llame a la clase madre:
public DlgNuevo( Frame padre, String titulo, boolean esModal ) {
super( padre, titulo, esModal );
…
• La ventana de diálogo necesita “saber” quien es su ventana madre, normalmente un JFrame
• Una ventana de diálogo puede ser modal (tiene el control, recibe los eventos) o no modal (la ventana
madre puede tener el control y recibir eventos)
– Desde la clase madre se instancia la ventana de diálogo (en este ejemplo es no modal) y se le
dice que se muestre, mediante setVisible(true). En versiones anteriores a 1.1 se usaba show():
DlgNuevo dialogo = new DlgNuevo(this, "Nuevo", false);
dialogo.setVisible(true);
2
Ventanas de diálogo: introducción (II)
•
En nuestro ejemplo hemos puesto un pequeño editor de texto en la ventana madre
public class Marco extends JFrame implements ActionListener {
JEditorPane editor = new JEditorPane();
•
El editor tiene un scroll:
JScrollPane scrollEditor = new JScrollPane( editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
//// Configura panel principal
panelPrincipal = (JPanel) this.getContentPane();
panelPrincipal.setLayout( new BorderLayout());
panelPrincipal.add( scrollEditor, BorderLayout.CENTER );
•
•
Cuando se escoge una opción de menú se escribe la cadena correspondiente en el editor.
Si la opción es “Nuevo”, además se crea una ventana de diálogo no modal
public void actionPerformed(ActionEvent e) {
//// Nuevo: crea una ventana de cialogo
if ( e.getActionCommand().compareTo( ITEM_NUEVO ) == 0 ) {
String texto = editor.getText() + "Nuevo\n";
editor.setText(texto);
DlgNuevo dialogo = new DlgNuevo(this, "Nuevo", false);
dialogo.setVisible(true);
return;
}
3
Ventanas de diálogo: Util.java (I)
•
•
Uno de los aspectos más costosos de codificar es el conjunto de decisiones de presentación: tamaño, color,
fuente, etc.; sobre todo cuando hay numerosas ventanas. Otra posibilidad de ahorrar código es definir la
presentación en archivos XML.
Conviene tener una clase en la que se centralizan las decisiones de presentación. En nuestro ejemplo la
hemos llamado Util.java:
public class Util {
//// Tamaños estandar para JTextField, JButton, JList, etc
public static Dimension tamanoBotones = new Dimension(150, 25);
….
//// Colores
public static java.awt.Color colorPanel = java.awt.Color.CYAN;
….
//// Fuentes
public static java.awt.Font fuentePanel = new java.awt.Font("Arial", java.awt.Font.BOLD, 12);
….
public void setTamanio( JComponent comp, int x, int y ) {
Dimension tam = new Dimension( x, y );
comp.setMaximumSize( tam );
comp.setPreferredSize( tam );
comp.setMinimumSize( tam );
comp.setSize( tam );
}
4
•
Ventanas de diálogo: Util.java (II)
En Util.java tenemos la configuración visual por defecto para paneles, ventanas de diálogo, botones, etc.
public void configPanelScroll( JScrollPane panel, String tituloBorde, Dimension dim ) {
panel.setBackground( colorPanelFondo);
panel.setForeground( colorPanel);
panel.setFont( fuentePanel);
if (tituloBorde != null) {
panel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(tituloBorde),
BorderFactory.createEmptyBorder( 6, 6, 6, 6)));
}
else
panel.setBorder( BorderFactory.createLineBorder( colorBordePanel ) );
if (dim != null)
setTamanio( (JComponent) panel, dim.width, dim.height);
panel.setOpaque(true);
}
public void configDialogo( JDialog dialogo, Dimension dim ) {
dialogo.setBackground( this.colorPanelFondo );
dialogo.setForeground( this.colorPanel );
dialogo.setFont( this.fuentePanel);
if ( dim != null )
dialogo.setSize(dim);
else
dialogo.setSize(tamanoDialogo);
}
….
5
Ventanas de diálogo: Util.java (III)
•
Util.java nos permite ahorrar muchas líneas de código a la hora de configurar la ventana de diálogo:
public DlgNuevo( Frame padre, String titulo, boolean esModal ) {
super( padre, titulo, esModal );
try {
this.padre = (Marco) padre;
//// Clase de utilidad para unificar presentación de componentes
Util dec = new Util();
//// Centro y configuro la JDialog
dec.configDialogo( this, new Dimension( 400, 80) );
//// Panel de detalle (lbl y campo de edición)
JPanel pnlDetalle = new JPanel();
pnlDetalle.setLayout( new BoxLayout( pnlDetalle, BoxLayout.LINE_AXIS));
dec.configEtiqueta( etiId, "Id:", null );
dec.configCampoTexto( txtId, "", "ID", null );
pnlDetalle.add( etiId );
pnlDetalle.add( txtId );
pnlDetalle.add( Box.createHorizontalGlue());
dec.configPanel( pnlDetalle, "Introduzca el ID del producto", null);
….
•
Aunque para este pequeño ejemplo no sea necesario, los textos conviene que estén en archivos de
propiedades
6
JList: introducción
•
Para comprender las listas, combos y tablas es necesario comprender el patrón ModeloVista. En nuestro ejemplo:
– La vista es la lista (JList)
– El modelo representa (por ejemplo DefaultListModel) los datos
•
•
Usaremos un atributo del tipo JList: JList lista
Para crear la lista en jbInit():
lista = new JList();
lista.setModel( cargarLista() );
lista.addListSelectionListener(this);
JScrollPane scrollLista = new JScrollPane( lista, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
– A la lista (vista) se le asigna el modelo (datos)
– También asignamos un listener para capturar el evento de selección en la lista: la selección se
borra y se copia al editor
– Asignamos scroll
7
JList: crear un modelo
• Un modelo no es más que una estructura de datos lineal, a la que vamos
añadiendo los objetos (items) que aparecerán en la lista.
• En nuestro ejemplo creamos el modelo y lo devolvemos para que
posteriormente sea asignado a la lista:
private DefaultListModel cargarLista( ) {
DefaultListModel modelo = new DefaultListModel();
modelo.addElement( "Buenos dias" );
modelo.addElement( "Buenas noches" );
modelo.addElement( "¿Me sigue?" );
modelo.addElement( "Pues va a ser que no" );
modelo.addElement( "Me llamo Pablo" );
modelo.addElement( "¿Qué tal está?" );
return modelo;
}
• El modelo es abstracto. Podemos poner en él cualquier objeto, por
ejemplo de una clase creada por el programador; en este caso tenemos
que implementar toString() en nuestra clase, ya que lo que devuelve este
método es lo que aparecerá en la lista.
8
JList: listener
•
Hemos puesto un listener a nuestra lista. Para lo cual declaramos el interfaz correspondiente:
public class Marco extends JFrame implements ListSelectionListener {
JList lista;
….
•
Asignamos el listener a la lista:
lista.addListSelectionListener(this);
•
Evidentemente hay que implementar el método que recibe el evento:
public void valueChanged(ListSelectionEvent e) {
//// Si el usuario ha dejado de manipular la lista
if (e.getValueIsAdjusting() == false) {
int index = lista.getSelectedIndex();
//// Si hay selección se escribe en editor y se borra de la lista
if ( index != -1 ) {
DefaultListModel modelo = (DefaultListModel) lista.getModel();
String seleccion = (String) modelo.getElementAt( index);
String texto = editor.getText() + seleccion + "\n";
editor.setText(texto);
modelo.removeElementAt( index );
}
}
}
9