En este artículo, aprenderemos a crear una aplicación en JavaFX que permite gestionar alumnos y profesores. La aplicación incluirá una barra de menú, un ChoiceBox para seleccionar alumnos, y un TabPane para mostrar y editar información sobre profesores. 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
- Alumnos:
- Eliminar
- Cargar
- Contenido Principal:
- ChoiceBox para seleccionar alumnos.
- 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.
Funcionalidades del Menú
- Archivo -> Cargar: Carga la lista de alumnos en el ChoiceBox.
- Archivo -> Salir: Cierra la aplicación.
- Profesores -> Mostrar Datos: Abre una ventana para seleccionar un profesor y mostrar sus datos.
- Alumnos -> Eliminar: Elimina el alumno seleccionado del ChoiceBox.
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 gestion.alumnos.profesores;
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> studentChoiceBox;
private TabPane tabPane;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Gestión de Alumnos y Profesores");
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 800, 600);
// Barra de menú
MenuBar menuBar = createMenuBar(primaryStage);
// ChoiceBox para alumnos
studentChoiceBox = new ChoiceBox<>();
Label studentLabel = new Label("Alumno:");
BorderPane topPane = new BorderPane();
topPane.setLeft(studentLabel);
topPane.setCenter(studentChoiceBox);
// 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 showDataItem = new MenuItem("Mostrar Datos");
teacherMenu.getItems().add(showDataItem);
Menu studentMenu = new Menu("Alumnos");
MenuItem deleteItem = new MenuItem("Eliminar");
MenuItem loadStudentItem = new MenuItem("Cargar");
studentMenu.getItems().addAll(deleteItem, loadStudentItem);
menuBar.getMenus().addAll(fileMenu, teacherMenu, studentMenu);
// Eventos de los menús
loadItem.setOnAction(event -> loadStudents());
exitItem.setOnAction(event -> primaryStage.close());
showDataItem.setOnAction(event -> showTeacherData());
deleteItem.setOnAction(event -> deleteStudent());
loadStudentItem.setOnAction(event -> loadStudents());
return menuBar;
}
private void loadStudents() {
// Aquí cargarías la lista de alumnos desde una BD o una lista.
studentChoiceBox.getItems().addAll("Alumno 1", "Alumno 2", "Alumno 3", "Alumno 4");
}
private void deleteStudent() {
// Eliminar el alumno seleccionado
String selectedStudent = studentChoiceBox.getSelectionModel().getSelectedItem();
if (selectedStudent != null) {
studentChoiceBox.getItems().remove(selectedStudent);
}
}
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();
}
}
TeacherTab.java
package gestion.alumnos.profesores;
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);
}
}
Pantallazos de la Aplicación
- Pantalla Principal: Mostrando el menú y el ChoiceBox de alumnos.
- Menú Archivo -> Cargar: ChoiceBox cargado con alumnos.
- 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.
Conclusión
Este ejercicio de JavaFX demuestra cómo estructurar una aplicación con menús y un contenido principal dinámico. 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.