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 novembro de 2025, 6:47 PM