En este artículo, aprenderemos a crear una aplicación en JavaFX que permite gestionar clientes, profesores y facturas en una academia de programación y matemáticas. La aplicación incluirá una barra de menú, un ChoiceBox para seleccionar clientes, y un TabPane para mostrar y editar información sobre profesores y facturas. La aplicación también contará con un diseño modular y un código bien comentado para facilitar su mantenimiento y comprensión.
Requisitos del Ejercicio
Características de la Aplicación
- Menú:
- Archivo:
- Cargar
- Salir
- Profesores:
- Mostrar Datos
- Clientes:
- Eliminar
- Cargar
- Facturas:
- Mostrar Datos
- Contenido Principal:
- ChoiceBox para seleccionar clientes.
- TabPane debajo del ChoiceBox.
- Pestaña «Lista de Profesores» con un listado de profesores y un botón «Editar» para cada profesor.
- Pestaña «Editar Profesor» que carga los datos del profesor seleccionado en un formulario.
- Pestaña «Lista de Facturas» que muestra las facturas de los clientes.
Funcionalidades del Menú
- Archivo -> Cargar: Carga la lista de clientes en el ChoiceBox.
- Archivo -> Salir: Cierra la aplicación.
- Profesores -> Mostrar Datos: Abre una ventana para seleccionar un profesor y mostrar sus datos.
- Clientes -> Eliminar: Elimina el cliente seleccionado del ChoiceBox.
- Facturas -> Mostrar Datos: Muestra las facturas de un cliente seleccionado.
Código Modular y Comentado
A continuación, se presenta el código fuente para la aplicación JavaFX con las características descritas.
Código Fuente de la Aplicación
Main.java
package academia.gestion;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
private ChoiceBox<String> customerChoiceBox;
private TabPane tabPane;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Gestión de Clientes, Profesores y Facturas en Academia");
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 800, 600);
// Barra de menú
MenuBar menuBar = createMenuBar(primaryStage);
// ChoiceBox para clientes
customerChoiceBox = new ChoiceBox<>();
Label customerLabel = new Label("Cliente:");
BorderPane topPane = new BorderPane();
topPane.setLeft(customerLabel);
topPane.setCenter(customerChoiceBox);
// TabPane
tabPane = new TabPane();
root.setTop(menuBar);
root.setCenter(tabPane);
root.setBottom(topPane);
primaryStage.setScene(scene);
primaryStage.show();
}
private MenuBar createMenuBar(Stage primaryStage) {
MenuBar menuBar = new MenuBar();
Menu fileMenu = new Menu("Archivo");
MenuItem loadItem = new MenuItem("Cargar");
MenuItem exitItem = new MenuItem("Salir");
fileMenu.getItems().addAll(loadItem, exitItem);
Menu teacherMenu = new Menu("Profesores");
MenuItem showTeacherDataItem = new MenuItem("Mostrar Datos");
teacherMenu.getItems().add(showTeacherDataItem);
Menu customerMenu = new Menu("Clientes");
MenuItem deleteCustomerItem = new MenuItem("Eliminar");
MenuItem loadCustomerItem = new MenuItem("Cargar");
customerMenu.getItems().addAll(deleteCustomerItem, loadCustomerItem);
Menu invoiceMenu = new Menu("Facturas");
MenuItem showInvoiceDataItem = new MenuItem("Mostrar Datos");
invoiceMenu.getItems().add(showInvoiceDataItem);
menuBar.getMenus().addAll(fileMenu, teacherMenu, customerMenu, invoiceMenu);
// Eventos de los menús
loadItem.setOnAction(event -> loadCustomers());
exitItem.setOnAction(event -> primaryStage.close());
showTeacherDataItem.setOnAction(event -> showTeacherData());
deleteCustomerItem.setOnAction(event -> deleteCustomer());
loadCustomerItem.setOnAction(event -> loadCustomers());
showInvoiceDataItem.setOnAction(event -> showInvoiceData());
return menuBar;
}
private void loadCustomers() {
// Borrar la lista actual de clientes
customerChoiceBox.getItems().clear();
// Aquí cargarías la lista de clientes desde una BD o una lista.
customerChoiceBox.getItems().addAll("Cliente 1", "Cliente 2", "Cliente 3", "Cliente 4");
}
private void deleteCustomer() {
// Eliminar el cliente seleccionado
String selectedCustomer = customerChoiceBox.getSelectionModel().getSelectedItem();
if (selectedCustomer != null) {
customerChoiceBox.getItems().remove(selectedCustomer);
}
}
private void showTeacherData() {
// Mostrar datos de un profesor
Stage teacherStage = new Stage();
teacherStage.setTitle("Mostrar Datos de Profesor");
BorderPane teacherPane = new BorderPane();
Scene teacherScene = new Scene(teacherPane, 300, 200);
ChoiceBox<String> teacherChoiceBox = new ChoiceBox<>();
teacherChoiceBox.getItems().addAll("Profesor 1", "Profesor 2", "Profesor 3");
Button showButton = new Button("Mostrar");
Label teacherDataLabel = new Label();
showButton.setOnAction(event -> {
String selectedTeacher = teacherChoiceBox.getSelectionModel().getSelectedItem();
if (selectedTeacher != null) {
teacherDataLabel.setText("Datos del " + selectedTeacher); // Aquí cargarías los datos reales
}
});
teacherPane.setTop(teacherChoiceBox);
teacherPane.setCenter(showButton);
teacherPane.setBottom(teacherDataLabel);
teacherStage.setScene(teacherScene);
teacherStage.show();
}
private void showInvoiceData() {
// Mostrar datos de facturas
Stage invoiceStage = new Stage();
invoiceStage.setTitle("Mostrar Datos de Facturas");
BorderPane invoicePane = new BorderPane();
Scene invoiceScene = new Scene(invoicePane, 300, 200);
ChoiceBox<String> invoiceChoiceBox = new ChoiceBox<>();
invoiceChoiceBox.getItems().addAll("Factura 1", "Factura 2", "Factura 3");
Button showButton = new Button("Mostrar");
Label invoiceDataLabel = new Label();
showButton.setOnAction(event -> {
String selectedInvoice = invoiceChoiceBox.getSelectionModel().getSelectedItem();
if (selectedInvoice != null) {
invoiceDataLabel.setText("Datos de " + selectedInvoice); // Aquí cargarías los datos reales
}
});
invoicePane.setTop(invoiceChoiceBox);
invoicePane.setCenter(showButton);
invoicePane.setBottom(invoiceDataLabel);
invoiceStage.setScene(invoiceScene);
invoiceStage.show();
}
}
TeacherTab.java
package academia.gestion;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.VBox;
public class TeacherTab extends Tab {
public TeacherTab() {
setText("Lista de Profesores");
VBox vbox = new VBox();
for (int i = 1; i <= 5; i++) {
final int teacherNumber = i; // Variable temporal
Label teacherLabel = new Label("Profesor " + teacherNumber);
Button editButton = new Button("Editar");
editButton.setOnAction(event -> editTeacher("Profesor " + teacherNumber));
vbox.getChildren().addAll(teacherLabel, editButton);
}
setContent(vbox);
}
private void editTeacher(String teacherName) {
// Crear una nueva pestaña para editar el profesor
Tab editTab = new Tab("Editar " + teacherName);
VBox editBox = new VBox();
Label nameLabel = new Label("Nombre: " + teacherName);
Label infoLabel = new Label("Información adicional..."); // Aquí cargarías los datos reales
editBox.getChildren().addAll(nameLabel, infoLabel);
editTab.setContent(editBox);
((TabPane) getTabPane()).getTabs().add(editTab);
}
}
InvoiceTab.java
package academia.gestion;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.VBox;
public class InvoiceTab extends Tab {
public InvoiceTab() {
setText("Lista de Facturas");
VBox vbox = new VBox();
for (int i = 1; i <= 5; i++) {
final int invoiceNumber = i; // Variable temporal
Label invoiceLabel = new Label("Factura " + invoiceNumber);
Button viewButton = new Button("Ver");
viewButton.setOnAction(event -> viewInvoice("Factura " + invoiceNumber));
vbox.getChildren().addAll(invoiceLabel, viewButton);
}
setContent(vbox);
}
private void viewInvoice(String invoiceName) {
// Crear una nueva pestaña para ver la factura
Tab viewTab = new
Tab("Ver " + invoiceName);
VBox viewBox = new VBox();
Label nameLabel = new Label("Nombre: " + invoiceName);
Label infoLabel = new Label("Información adicional..."); // Aquí cargarías los datos reales
viewBox.getChildren().addAll(nameLabel, infoLabel);
viewTab.setContent(viewBox);
((TabPane) getTabPane()).getTabs().add(viewTab);
}
}
Pantallazos de la Aplicación
- Pantalla Principal: Mostrando el menú y el ChoiceBox de clientes.
- Menú Archivo -> Cargar: ChoiceBox cargado con clientes.
- Menú Profesores -> Mostrar Datos: Ventana con datos del profesor seleccionado.
- Pestaña «Lista de Profesores»: Lista de profesores con botones «Editar».
- Pestaña «Editar Profesor»: Formulario para editar los datos del profesor seleccionado.
- Menú Facturas -> Mostrar Datos: Ventana con datos de las facturas.
- Pestaña «Lista de Facturas»: Lista de facturas con botones «Ver».
- Pestaña «Ver Factura»: Detalles de la factura seleccionada.
Conclusión
Este ejercicio de JavaFX demuestra cómo estructurar una aplicación con menús y un contenido principal dinámico para gestionar clientes, profesores y facturas en una academia de programación y matemáticas. La limpieza, el orden y la optimización del código son esenciales para la mantenibilidad y escalabilidad de la aplicación. Utilizar nombres de variables y funciones adecuados, además de código modular y comentado, facilita el entendimiento y la colaboración en proyectos de desarrollo.