SlideShare una empresa de Scribd logo
1 de 13
Descargar para leer sin conexión
CONSTRUCCIÓN
DE INTERFACES
DE USUARIO
2do Cuatrimestre de 2018
4.2.
NAVEGACIÓN
WINDOWS & DIALOGS
Ventana Principal
2
Hasta el momento venimos usando una sola
ventana:
▸ Creamos una LoQueSeaWindow que extienda
de MainWindow<T>
▸ Definimos el constructor pasándole el
modelo
▸ Sobreescribimos el método createContents
con el contenido
▸ Y levantamos la aplicación desde el main
Ventana Principal
3
class MainCompanyWindow extends MainWindow<Company> {
new(Company model) { super(model) }
static def void main(String[] arg) {
new MainCompanyWindow(new Company).startApplication
}
override createContents(Panel mainPanel) {
this.title = "Empresa"
new Label(mainPanel).text = "Empleados: "
new List<Employee>(mainPanel) => [
value <=> "empl"
(items <=> "employees")
.adaptWith(Employee, "description")
]
}
}
¿Y cómo levanto otra
ventana?
4
▸ A partir de algún evento podemos instanciar
una nueva ventana
▸ Esta ventana debe conocer a la ventana que
la invocó (solemos llamarla owner or parent)
▸ Y también debe tener un model object, el
cual debe ser “pasado” desde el parent
Tipos de Ventanas
5
▸ Window: es la clase abstracta para todas las
ventanas
▸ MainWindow: es un tipo especial de ventana
que se usa para aplicaciones simples o de
una sola ventana
▸ SimpleWindow: ventana común que agrega el
panel de errores
▸ Dialog: es una ventana final que depende de
alguna de las anteriores y que debe generar
una acción y cerrarse
Jerarquía
6
Window ⇒ Dialog
7
class MainCompanyWindow extends MainWindow<Company> {
override createContents(Panel mainPanel) {
...
new Button(mainPanel) => [
caption = "Editar"
onClick([|this.edit])
]
}
def edit() {
new EmployeeDialog(this, modelObject.employees.get(0)) => [
onAccept[this.modelObject.employees.add(
new Employee("White Walker", 0))
]
open
]
}
}
Dialog
8
class EmployeeDialog extends Dialog<Employee> {
new(WindowOwner owner, Employee model) {
super(owner, model)
}
override protected void addActions(Panel actions) {
new Button(actions) => [
caption = "Aceptar"
onClick [|this.accept]
]
new Button(actions) => [
caption = "Cancelar"
onClick [|this.cancel]
]
}
override protected createFormPanel(Panel mainPanel) {
new Label(mainPanel).text = this.modelObject.name
}
}
Window ⇒ Window
9
▸ Las ventanas Dialog funcionan como “modales”, o
sea que se usan para una función específica y se
cierran.
▸ Se pueden seguir abriendo ventanas o dialogs
desde un Dialog pero no es recomendable porque
se van “stackeando”
▸ Para poder trabajar con ventanas independientes
deben ser Window o SimpleWindow.
▸ Una MainWindow puede abrir una Window pero luego
nunca más se puede volver a la MainWindow.
Window ⇒ Window
10
▸ Pero las ventanas Window no pueden ser
inicializadas desde un main() como sí sucedía con
MainWindow
▸ Es necesario otra estrategia de inicialización
▹ Hay que usar la clase Application
▹ Que se encarga de inicializar la aplicación y
llamar a la Window que indiquemos como
“inicial”
▹ Luego vamos a poder interactuar entre Windows
y Dialogs libremente
Application ⇒ Window
11
class MyApplication extends Application {
override protected Window<?> createMainWindow() {
new CompanyWindow(this)
}
def static main(String[] args) {
new MyApplication().start()
}
}
Window ⟺ Window
12
class CompanyWindow
extends SimpleWindow<Company> {
new(WindowOwner parent) {
super(parent, new Company)
}
override createContents(Panel mainPanel) {
this.title = "Empresa"
new Button(mainPanel) => [
caption = "Abrir Empleado"
onClick[
this.close
new EmployeeWindow(this,
this.modelObject.employees.get(0)
).open
]
]
}
}
class EmployeeWindow
extends SimpleWindow<Employee> {
new(WindowOwner owner, Employee model) {
super(owner, model)
}
override createContents(Panel mainPanel) {
this.title = "Empleado"
new Button(mainPanel) => [
caption = "Volver a Empresa"
onClick[
this.close
new CompanyWindow(this).open
]
]
}
}
Demo
13

Más contenido relacionado

Más de xavazque2

Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlinCurso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
xavazque2
 
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
xavazque2
 
266521557 apuntes-unidad-formativa-app-inventor
266521557 apuntes-unidad-formativa-app-inventor266521557 apuntes-unidad-formativa-app-inventor
266521557 apuntes-unidad-formativa-app-inventor
xavazque2
 
484719815 pidiendo-ayuda-a-los-angeles-pdf
484719815 pidiendo-ayuda-a-los-angeles-pdf484719815 pidiendo-ayuda-a-los-angeles-pdf
484719815 pidiendo-ayuda-a-los-angeles-pdf
xavazque2
 

Más de xavazque2 (20)

258939538 dumping
258939538 dumping258939538 dumping
258939538 dumping
 
380914324 poo-kotlin
380914324 poo-kotlin380914324 poo-kotlin
380914324 poo-kotlin
 
146817358 android
146817358 android146817358 android
146817358 android
 
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlinCurso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
 
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
 
325940441 motion-ui
325940441 motion-ui325940441 motion-ui
325940441 motion-ui
 
371081023 curso-desarrollo-android
371081023 curso-desarrollo-android371081023 curso-desarrollo-android
371081023 curso-desarrollo-android
 
4.1. validaciones-y-excepciones
4.1. validaciones-y-excepciones4.1. validaciones-y-excepciones
4.1. validaciones-y-excepciones
 
3.1 mvc-mvvm-app model-binding
3.1 mvc-mvvm-app model-binding3.1 mvc-mvvm-app model-binding
3.1 mvc-mvvm-app model-binding
 
5.1. stateles stateful-protocolo_http
5.1. stateles stateful-protocolo_http5.1. stateles stateful-protocolo_http
5.1. stateles stateful-protocolo_http
 
435338801 programacion-mobile-android
435338801 programacion-mobile-android435338801 programacion-mobile-android
435338801 programacion-mobile-android
 
457126889 android-pdf
457126889 android-pdf457126889 android-pdf
457126889 android-pdf
 
266521557 apuntes-unidad-formativa-app-inventor
266521557 apuntes-unidad-formativa-app-inventor266521557 apuntes-unidad-formativa-app-inventor
266521557 apuntes-unidad-formativa-app-inventor
 
7. react js-1
7. react js-17. react js-1
7. react js-1
 
Tp1
Tp1Tp1
Tp1
 
484719815 pidiendo-ayuda-a-los-angeles-pdf
484719815 pidiendo-ayuda-a-los-angeles-pdf484719815 pidiendo-ayuda-a-los-angeles-pdf
484719815 pidiendo-ayuda-a-los-angeles-pdf
 
484717855 transmutacion-de-energias-pdf
484717855 transmutacion-de-energias-pdf484717855 transmutacion-de-energias-pdf
484717855 transmutacion-de-energias-pdf
 
5.layouts
5.layouts5.layouts
5.layouts
 
6.2. js
6.2. js6.2. js
6.2. js
 
411958729 curso-de-delphi-pdf
411958729 curso-de-delphi-pdf411958729 curso-de-delphi-pdf
411958729 curso-de-delphi-pdf
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 

4.windows dialogs

  • 1. CONSTRUCCIÓN DE INTERFACES DE USUARIO 2do Cuatrimestre de 2018 4.2. NAVEGACIÓN WINDOWS & DIALOGS
  • 2. Ventana Principal 2 Hasta el momento venimos usando una sola ventana: ▸ Creamos una LoQueSeaWindow que extienda de MainWindow<T> ▸ Definimos el constructor pasándole el modelo ▸ Sobreescribimos el método createContents con el contenido ▸ Y levantamos la aplicación desde el main
  • 3. Ventana Principal 3 class MainCompanyWindow extends MainWindow<Company> { new(Company model) { super(model) } static def void main(String[] arg) { new MainCompanyWindow(new Company).startApplication } override createContents(Panel mainPanel) { this.title = "Empresa" new Label(mainPanel).text = "Empleados: " new List<Employee>(mainPanel) => [ value <=> "empl" (items <=> "employees") .adaptWith(Employee, "description") ] } }
  • 4. ¿Y cómo levanto otra ventana? 4 ▸ A partir de algún evento podemos instanciar una nueva ventana ▸ Esta ventana debe conocer a la ventana que la invocó (solemos llamarla owner or parent) ▸ Y también debe tener un model object, el cual debe ser “pasado” desde el parent
  • 5. Tipos de Ventanas 5 ▸ Window: es la clase abstracta para todas las ventanas ▸ MainWindow: es un tipo especial de ventana que se usa para aplicaciones simples o de una sola ventana ▸ SimpleWindow: ventana común que agrega el panel de errores ▸ Dialog: es una ventana final que depende de alguna de las anteriores y que debe generar una acción y cerrarse
  • 7. Window ⇒ Dialog 7 class MainCompanyWindow extends MainWindow<Company> { override createContents(Panel mainPanel) { ... new Button(mainPanel) => [ caption = "Editar" onClick([|this.edit]) ] } def edit() { new EmployeeDialog(this, modelObject.employees.get(0)) => [ onAccept[this.modelObject.employees.add( new Employee("White Walker", 0)) ] open ] } }
  • 8. Dialog 8 class EmployeeDialog extends Dialog<Employee> { new(WindowOwner owner, Employee model) { super(owner, model) } override protected void addActions(Panel actions) { new Button(actions) => [ caption = "Aceptar" onClick [|this.accept] ] new Button(actions) => [ caption = "Cancelar" onClick [|this.cancel] ] } override protected createFormPanel(Panel mainPanel) { new Label(mainPanel).text = this.modelObject.name } }
  • 9. Window ⇒ Window 9 ▸ Las ventanas Dialog funcionan como “modales”, o sea que se usan para una función específica y se cierran. ▸ Se pueden seguir abriendo ventanas o dialogs desde un Dialog pero no es recomendable porque se van “stackeando” ▸ Para poder trabajar con ventanas independientes deben ser Window o SimpleWindow. ▸ Una MainWindow puede abrir una Window pero luego nunca más se puede volver a la MainWindow.
  • 10. Window ⇒ Window 10 ▸ Pero las ventanas Window no pueden ser inicializadas desde un main() como sí sucedía con MainWindow ▸ Es necesario otra estrategia de inicialización ▹ Hay que usar la clase Application ▹ Que se encarga de inicializar la aplicación y llamar a la Window que indiquemos como “inicial” ▹ Luego vamos a poder interactuar entre Windows y Dialogs libremente
  • 11. Application ⇒ Window 11 class MyApplication extends Application { override protected Window<?> createMainWindow() { new CompanyWindow(this) } def static main(String[] args) { new MyApplication().start() } }
  • 12. Window ⟺ Window 12 class CompanyWindow extends SimpleWindow<Company> { new(WindowOwner parent) { super(parent, new Company) } override createContents(Panel mainPanel) { this.title = "Empresa" new Button(mainPanel) => [ caption = "Abrir Empleado" onClick[ this.close new EmployeeWindow(this, this.modelObject.employees.get(0) ).open ] ] } } class EmployeeWindow extends SimpleWindow<Employee> { new(WindowOwner owner, Employee model) { super(owner, model) } override createContents(Panel mainPanel) { this.title = "Empleado" new Button(mainPanel) => [ caption = "Volver a Empresa" onClick[ this.close new CompanyWindow(this).open ] ] } }