SlideShare una empresa de Scribd logo
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

PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docxPRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
encinasm992
 

Último (20)

Presentacion y Extension de tema para Blogger.pptx
Presentacion y Extension de tema para Blogger.pptxPresentacion y Extension de tema para Blogger.pptx
Presentacion y Extension de tema para Blogger.pptx
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
Estudio de la geometría analitica. Pptx.
Estudio de la geometría analitica. Pptx.Estudio de la geometría analitica. Pptx.
Estudio de la geometría analitica. Pptx.
 
Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.
 
PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docxPRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
PRÁCTICAS DEL MÓDULO I Y II DE EDUCACIÓN Y SOCIEDAD.docx
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadas
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Robótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptxRobótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptx
 
lenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometrialenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometria
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL Server
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
 
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdfHIGADO  Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
HIGADO Y TRAUMA HEPATICO UDABOL 2024 (3).pdf
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 

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 ] ] } }