Código Agenda telefónica
Requisitos de finalización

public class UD02T02_AgendaTelefonica extends Application {
private final ObservableList<Contacto> contactos = FXCollections.observableArrayList();
@Override
public void start(Stage stage) {
// Lado izquierdo: formulario y botones
VBox leftPane = new VBox(10);
leftPane.setPadding(new Insets(20));
leftPane.setAlignment(Pos.TOP_LEFT);
leftPane.setStyle(
"-fx-background-color: #f2f2f2;"
+ "-fx-border-color: #dddddd;"
+ "-fx-border-radius: 8;"
+ "-fx-background-radius: 8;"
);
Label titulo = new Label("Agenda Personal");
titulo.setFont(new Font("Arial", 24));
titulo.setStyle(
"-fx-text-fill: #333333;"
+ "-fx-font-weight: bold;"
+ "-fx-padding: 0 0 10 0;"
);
String estiloLabelFormulario
= "-fx-font-weight: bold;"
+ "-fx-text-fill: #555555;";
Label lblNombre = new Label("Nombre:");
lblNombre.setStyle(estiloLabelFormulario);
TextField txtNombre = new TextField();
txtNombre.setPromptText("Introduce el nombre");
txtNombre.setStyle(
"-fx-background-radius: 6;"
+ "-fx-border-radius: 6;"
+ "-fx-border-color: #cccccc;"
+ "-fx-padding: 4 6 4 6;"
);
Label lblApellido = new Label("Apellido:");
lblApellido.setStyle(estiloLabelFormulario);
TextField txtApellido = new TextField();
txtApellido.setPromptText("Introduce el apellido");
txtApellido.setStyle(
"-fx-background-radius: 6;"
+ "-fx-border-radius: 6;"
+ "-fx-border-color: #cccccc;"
+ "-fx-padding: 4 6 4 6;"
);
Label lblTelefono = new Label("Teléfono:");
lblTelefono.setStyle(estiloLabelFormulario);
TextField txtTelefono = new TextField();
txtTelefono.setPromptText("Introduce el teléfono");
txtTelefono.setStyle(
"-fx-background-radius: 6;"
+ "-fx-border-radius: 6;"
+ "-fx-border-color: #cccccc;"
+ "-fx-padding: 4 6 4 6;"
);
Button btnGuardar = new Button("Guardar");
btnGuardar.setStyle(
"-fx-background-color: #4caf50;"
+ "-fx-text-fill: white;"
+ "-fx-background-radius: 8;"
+ "-fx-padding: 6 14 6 14;"
+ "-fx-cursor: hand;"
);
Button btnLimpiar = new Button("Limpiar");
btnLimpiar.setStyle(
"-fx-background-color: #f44336;"
+ "-fx-text-fill: white;"
+ "-fx-background-radius: 8;"
+ "-fx-padding: 6 14 6 14;"
+ "-fx-cursor: hand;"
);
HBox botonesForm = new HBox(10, btnGuardar, btnLimpiar);
botonesForm.setAlignment(Pos.CENTER_LEFT);
leftPane.getChildren().addAll(
titulo,
lblNombre, txtNombre,
lblApellido, txtApellido,
lblTelefono, txtTelefono,
botonesForm
);
// Lado derecho: botón de ver datos y tabla
VBox rightPane = new VBox(10);
rightPane.setPadding(new Insets(20));
rightPane.setAlignment(Pos.TOP_CENTER);
rightPane.setStyle(
"-fx-background-color: #ffffff;"
+ "-fx-border-color: #dddddd;"
+ "-fx-border-radius: 8;"
+ "-fx-background-radius: 8;"
);
Button btnVerDatos = new Button("Ver datos agenda");
btnVerDatos.setStyle(
"-fx-background-color: transparent;"
+ "-fx-border-color: #272EF5;"
+ "-fx-text-fill: #272EF5;"
+ "-fx-background-radius: 8;"
+ "-fx-padding: 6 14 6 14;"
+ "-fx-cursor: hand;"
);
TableView<Contacto> table = new TableView<>();
table.setPrefWidth(400);
table.setStyle(
"-fx-border-color: #dddddd;"
+ "-fx-border-radius: 6;"
+ "-fx-background-radius: 6;"
);
// Creamos una columna de la tabla para mostrar el nombre.
// El texto "Nombre" es el título que aparecerá en la cabecera de la columna.
TableColumn colNombre = new TableColumn("Nombre");
// Indicamos de dónde obtiene esta columna el valor que mostrará en cada fila.
// PropertyValueFactory busca, en la clase Contacto, el método getNombre()
// (porque le pasamos la cadena "nombre") y usa ese valor para la celda.
colNombre.setCellValueFactory(new PropertyValueFactory<Contacto, String>("nombre"));
// Creamos una columna de la tabla para mostrar el apellido.
// El texto "Apellido" es el texto que verá el usuario en la cabecera.
TableColumn colApellido = new TableColumn("Apellido");
// Esta columna tomará su valor de la propiedad "apellido" de la clase Contacto,
// es decir, llamará internamente a getApellido() para cada objeto Contacto de la tabla.
colApellido.setCellValueFactory(new PropertyValueFactory<Contacto, String>("apellido"));
// Creamos una columna de la tabla para mostrar el teléfono.
// "Teléfono" será el texto de la cabecera de la columna.
TableColumn colTelefono = new TableColumn("Teléfono");
// Igual que antes, esta columna usará la propiedad "telefono" del objeto Contacto,
// lo que implica que JavaFX llamará a getTelefono() para rellenar las celdas.
colTelefono.setCellValueFactory(new PropertyValueFactory<Contacto, String>("telefono"));
table.getColumns().addAll(colNombre, colApellido, colTelefono);
rightPane.getChildren().addAll(btnVerDatos, table);
// Layout principal
HBox root = new HBox(20, leftPane, rightPane);
root.setPadding(new Insets(10));
root.setStyle(
"-fx-background-color: #f5f5f5;"
);
// Funcionalidades
btnGuardar.setOnAction(e -> {
String nombre = txtNombre.getText().trim();
String apellido = txtApellido.getText().trim();
String telefono = txtTelefono.getText().trim();
if (!nombre.isEmpty() && !apellido.isEmpty() && !telefono.isEmpty()) {
contactos.add(new Contacto(nombre, apellido, telefono));
txtNombre.clear();
txtApellido.clear();
txtTelefono.clear();
} else {
new Alert(Alert.AlertType.WARNING,
"Por favor, completa todos los campos.").show();
}
});
btnLimpiar.setOnAction(e -> {
txtNombre.clear();
txtApellido.clear();
txtTelefono.clear();
});
btnVerDatos.setOnAction(e -> table.setItems(contactos));
Scene scene = new Scene(root, 800, 400);
stage.setTitle("Agenda Telefónica");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
// Clase interna para contacto
public static class Contacto {
private final String nombre;
private final String apellido;
private final String telefono;
public Contacto(String nombre, String apellido, String telefono) {
this.nombre = nombre;
this.apellido = apellido;
this.telefono = telefono;
}
public String getNombre() {
return nombre;
}
public String getApellido() {
return apellido;
}
public String getTelefono() {
return telefono;
}
}
}Última modificación: domingo, 23 de noviembre de 2025, 18:47