PDF de programación - GUIs en Java (4)

Imágen de pdf GUIs en Java (4)

GUIs en Java (4)gráfica de visualizaciones

Publicado el 3 de Mayo del 2017
356 visualizaciones desde el 3 de Mayo del 2017
404,3 KB
23 paginas
GUIs en Java (4)

Iván Alonso

e-mail: ivan.alonso.gutierrez@gmail.com

Recordatorio de sistemas de interfaces

AWT - Swing - SWT

AWT (Abstract Windowing Toolkit)

Utiliza los componentes nativos de cada sistema operativo
Los controles tienen funcionamientos similares pero
no idénticos
Sólo funcionalidades comunes a todos los ss.oo.

Swing

Programado en Java
Componentes “ligeros” (no reservan recursos nativos)
Extensible: proporciona distintos look & feel
Implementado mediante Modelo-Vista-Controlador

SWT (Standard Widget Toolkit)

Programado en Java (aunque exige deallocation)
Componentes “pesados” (llama a los recursos nativos)
Su implementación es distinta en cada plataforma
Extensible, aunque más difícil
No sigue el Modelo-Vista-Controlador

Personalización del Look & Feel

de las aplicaciones

Comportamiento por defecto en Swing

import javax.swing.*;

public class Main {
public static void main(String[] args) {
MySimpleGUI gui = new MySimpleGUI();
}
}

class MySimpleGUI extends JFrame {
public MySimpleGUI() {
setSize(400, 200);
setTitle("Ventana de tipo JFrame");
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Looks & Feels disponibles

Sun los proporciona como parte de JRE:

CrossPlatformLookAndFeel

Utilizado por defecto
Conocido como “Metal”

SystemLookAndFeel

Nativo del sistema

Synth

Básico para extender mediante archivos XML

Multiplexing

Para mezclar distintos Look & Feel

Otros (búsqueda en internet de “Look & Feel Themes”)

Gratuitos, comerciales, etc.

Aspecto de SystemLookAndFeel

Linux, Solaris (con GTK)

Linux, Solaris (sin GTK)

GTK+

Motif

Windows

IBM Unix

HP UX

Macintosh

Windows,

Windows XP,
Windows Vista

IBM *

HP *

Macintosh *

* Desarrollados por cada fabricante

Definiendo el aspecto a utilizar

import javax.swing.*;

public class Main {
public static void main(String[] args) {
String name = UIManager.getCrossPlatformLookAndFeelClassName();
try {
UIManager.setLookAndFeel(name);
}
catch(Exception e) {
return;
}
MySimpleGUI gui = new MySimpleGUI(name);
}
}

class MySimpleGUI extends JFrame {
public MySimpleGUI(String name) {
setSize(400, 200);
setTitle("Ventana " + name);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Definiendo el aspecto a utilizar (II)

CrossPlatformLookAndFeel

Linux (Ubuntu)

Mac OS X

[...]
String name = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(name);
}
[...]

Utilizando
SystemLookAndFeel

Definiendo el aspecto a utilizar (III)

Linux (Ubuntu)

Metal
(por defecto)

System

Mac OS X

Metal

System (por defecto)

Definiendo el aspecto a utilizar (IV)

Windows 7

Metal
(por defecto)

System

Es importante notar que no siempre el estilo por defecto será CrossPlatform
(Metal), como hemos visto en Mac OS X, por lo que es recomendable especificar
el look and feel a utilizar

Ejercicio 1 - rápido y sencillo :)

- Escoger uno de los últimos ejercicios realizados en
los anteriores temas

- Cambiar su look & feel y probarlo con CrossPlatform y
System

Ejercicio 2 - más largo :(

Realizaremos una primera versión de un “Hundir la
flota” muy simple

Mezclamos varias cosas de
las aprendidas durante todos
los temas de interfaces

Podremos ampliarlo más
adelante cuando estudiemos
los temas de redes

Ejercicio 2 (Pistas)

Una posible solución con tres objetos: el general que inicie los demás, el modelo de
datos del juego, y el interfaz gráfico (creado mediante el diseñador de NetBeans)

El modelo de datos puede ser una matriz
5x5 cuyos valores sean de una
enumeración (agua, barco, barco hundido,
etc)

Todos los botones pueden utilizar el
mismo listener, que obtenga su name del
evento recibido, y desde allí se llame a un
método de modelo de datos que actualice
la matriz

No hay una única solución
válida, hagámoslo entre todos

Ejercicio 2 (Ampliación)

Incluir un nuevo tablero inferior para
nuestra propia zona de juego, con su
propio tablero en el modelo de datos

Permitir hacer click sólo cinco veces, que
serán las localizaciones de nuestros
barcos. Tras inicializar nuestra zona,
deshabilitar todos los botones inferiores y
habilitar e inicializar la zona enemiga para
comenzar el juego

Revisar la inicialización de la zona enemiga,
para asegurarnos de que siempre tengamos
cinco (y sólo cinco) barcos asignados

Drag & Drop entre

componentes

Drag & Drop en Swing

Técnicamente está disponible entre todos los
componentes gráficos de Swing (JComponent)

Aunque algunos, lógicamente, requerirán código por nuestra parte

Funcionan directamente

Necesitan ajustes propios

JEditorPane
JFormattedTextField
JPasswordField
JTextArea
JTextField
JTextPane
JColorChooser

JList
JTable
JTree

Drag & Drop en Swing (II)

Funciones a utilizar (componentes estándar)

setDragEnable(boolean) - Para activar el drag & drop (desactivado por
defecto), disponible en los componentes estándar

Funciones a utilizar (componentes no estándar)

setDropMode(DropMode) - Para definir el funcionamiento (sólo) en los
componentes no estándar: JList, JTable y JTree
setTransferHandler(TransferHandler) - Para indicar el objeto encargado
de realizar la transferencia de información (sólo necesitamos cambiarlo si la forma de
cambiar información es distinta a la proporcionada por defecto)

Y hay que programar el objeto TransferHandler completo
Ejercicio recomendado:
http://java.sun.com/docs/books/tutorial/uiswing/dnd/index.html

Ejercicio simple de Drag & Drop

Crear una aplicación con diversos controles y activar
el Drag & Drop en todos ellos (setDragEnable)

Básicos:

JEditorPane
JFormattedTextField
JPasswordField
JTextArea
JTextField
JTextPane

Ejercicio complejo de Drag & Drop

Implementaremos nuestro propio TransferHandler para
utilizar con JList

La lista debe inicializarse mediante un DefaultListModel:

DefaultListModel model = new DefaultListModel();
for(int i = 0; i < data.length; i++) {
model.addElement(data[i]);
}
list.setModel(model);

TransferHandler

Nueva clase

public class ListTransferHandler extends TransferHandler

Nuestra lista la utilizará mediante:

list.setTransferHandler(new ListTransferHandler());

boolean canImport(TransferHandler.TransferSupport info)
Para definir qué tipo de información puede aceptar nuestro componente
Transferable createTransferable(JComponent c)
Para convertir la información de nuestro componente a un objeto transferible a
otros componentes
int getSourceActions(JComponent c)
Qué acciones permite el componente (copiar, mover o ambos)

boolean importData(TransferHandler.TransferSupport info)
Qué hacer tras recibir información (Drop)

void exportDone(JComponent c, Transferable data, int action)
Qué hacer tras enviar la información (Drag)
  • Links de descarga
http://lwp-l.com/pdf3310

Comentarios de: GUIs en Java (4) (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad