Populating textfields with tableview data when a line is clicked

…衆ロ難τιáo~ 提交于 2020-01-15 03:20:06

问题


I want to use the data that I load in the tableview to populate some textfields. Is there a way to make a OnMouseClick action event that will populate a bunch of textfields with the data from the tableview?

I want this because I want to make an update method, in which you don't have to write the whole service details(like price, department, availability, and name) again just to change one particular thing, but this is not an issue, I know how to do it, just need to auto populate the textfields for it with the data provided by the tableview.

Provided some commentary in the code.

Code for the tableview:

public class ProgramariDBController implements Initializable {
@FXML
private TextField Serviciu1;
@FXML
private TextField Departament1;
@FXML
private TextField Pret1;
@FXML
private TextField Disponibilitate1;
@FXML
private Label rows;
@FXML
private Label rows;
@FXML
private TextField cpn;
@FXML
private TextField nume1;
@FXML
private TableView<DetaliiProgramari> ProgrDB;
@FXML
private TableColumn<DetaliiProgramari, String> Nume;
@FXML
private TableColumn<DetaliiProgramari, String> Prenume;
@FXML
private TableColumn<DetaliiProgramari, String> Data;
@FXML
private TableColumn<DetaliiProgramari, String> Ora;
@FXML
private TableColumn<DetaliiProgramari, String> Departament;
@FXML
private TableColumn<DetaliiProgramari, String> Doctor;
@FXML
private TableColumn<DetaliiProgramari, String> Nr_telefon;

public LogareController Numeutilzator = new LogareController();
private ObservableList<DetaliiProgramari> Info;

@Override
public void initialize(URL url, ResourceBundle ResurcesFORDAYS) {
    // TODO

}



@FXML
private void AfiseazaProgramari(ActionEvent event) {
    try {
      ConectaredB ConectaredB=new ConectaredB();
        Connection conectare=ConectaredB.logareDB();

        Info = FXCollections.observableArrayList();
        String CNP=cpn.getText();
        ResultSet IncDate = conectare.createStatement().executeQuery("SELECT *  FROM programari where CNP=" + CNP);
        while (IncDate.next()) {

            Info.add(new DetaliiProgramari(IncDate.getString(2), IncDate.getString(3), IncDate.getString(4),
                    IncDate.getString(5), IncDate.getString(6), IncDate.getString(7), IncDate.getString(8)));
            //I have something like this 
     Serviciu1.setText(IncDate.getString(2)); it did work, but it loaded the first thing that was created in TipServiciu, which is a column in the table, so that doesn't really help, and I won't even paste the whole thing, because it will just be confusing for no reason.
        }

    } catch (SQLException ex) {
        System.err.println("Error"+ex);
    }

    Nume.setCellValueFactory(new PropertyValueFactory<>("Nume"));
    Prenume.setCellValueFactory(new PropertyValueFactory<>("Prenume"));
    Data.setCellValueFactory(new PropertyValueFactory<>("Data"));
    Ora.setCellValueFactory(new PropertyValueFactory<>("Ora"));
    Departament.setCellValueFactory(new PropertyValueFactory<>("Departament"));
    Doctor.setCellValueFactory(new PropertyValueFactory<>("Doctor"));
    Nr_telefon.setCellValueFactory(new PropertyValueFactory<>("Nr_telefon"));

    ProgrDB.setItems(null);
    ProgrDB.setItems(Info);

}
@FXML 
private void delete(ActionEvent event) throws IOException  {
    try { 


        String sql = "delete FROM programari where CNP=? ";
        ConectaredB ConectaredB=new ConectaredB();
        Connection conexiune=ConectaredB.logareDB();
        PreparedStatement ps = conexiune.prepareStatement(sql);
        String CNP=cpn.getText();
        ps.setString(1, CNP);
        int count = ps.executeUpdate();

        rows.setText("rows" +count);

    } catch (Exception e) {
        // TODO: handle exception
    }
}
 }

The setters and getters, if they help in any way possible:

public class ServiciiSittersGettersController {

private final StringProperty Serviciu;
private final StringProperty Disponibilitate;
private final StringProperty Pret;
private final StringProperty Departament;



//Default constructor
public ServiciiSittersGettersController(String Serviciu, String Disponibilitate, String Pret, String Departament) {
    this.Serviciu = new SimpleStringProperty(Serviciu);
    this.Disponibilitate = new SimpleStringProperty(Disponibilitate);
    this.Pret = new SimpleStringProperty(Pret);
    this.Departament = new SimpleStringProperty(Departament);


}
public String getDepartament() {
    return Departament.get();
}

public StringProperty departamentProperty() {
    return Departament;
}

public void setDepartament(String departament) {
    this.Departament.set(departament);
}

public String getServiciu() {
    return Serviciu.get();
}

public StringProperty serviciuProperty() {
    return Serviciu;
}

public void setServiciu(String serviciu) {
    this.Serviciu.set(serviciu);
}

public String getDisponibilitate() {
    return Disponibilitate.get();
}

public StringProperty disponibilitateProperty() {
    return Disponibilitate;
}

public void setDisponibilitate(String disponibilitate) {
    this.Disponibilitate.set(disponibilitate);
}

public String getPret() {
    return Pret.get();
}

public StringProperty pretProperty() {
    return Pret;
}

public void setPret(String pret) {
    this.Pret.set(pret);
}

}

回答1:


You have to add a listener to the TableView's getSelectionModel().selectedItemProperty().

Key code:

table.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> 
{
    if (newVal != null) {
        tfFirstName.setText(newVal.getFirstName());
        tfLastName.setText(newVal.getLastName());
        tfEmail.setText(newVal.getEmail());
    }
});

Full Code:

Main Class

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class TableViewSample extends Application
{

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        final ObservableList<Person> data = FXCollections.observableArrayList(
                new Person("Jacob", "Smith", "jacob.smith@example.com"),
                new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                new Person("Ethan", "Williams", "ethan.williams@example.com"),
                new Person("Emma", "Jones", "emma.jones@example.com"),
                new Person("Michael", "Brown", "michael.brown@example.com")
        );

        TableView<Person> table = new TableView();

        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(500);
        stage.setHeight(500);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        TableColumn firstNameCol = new TableColumn("First Name");
        TableColumn lastNameCol = new TableColumn("Last Name");
        TableColumn emailCol = new TableColumn("Email");
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory("firstName")
        );
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory("lastName")
        );
        emailCol.setCellValueFactory(
                new PropertyValueFactory("email")
        );
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
        table.setItems(data);

        TextField tfFirstName = new TextField();
        TextField tfLastName = new TextField();
        TextField tfEmail = new TextField();

        table.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
            if (newVal != null) {
                tfFirstName.setText(newVal.getFirstName());
                tfLastName.setText(newVal.getLastName());
                tfEmail.setText(newVal.getEmail());
            }
        });

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table, new HBox(new Label("First Name: "), tfFirstName), new HBox(new Label("Last Name: "), tfLastName), new HBox(new Label("Email: "), tfEmail));

        scene.setRoot(vbox);

        stage.setScene(scene);
        stage.show();
    }
}

Person Class

import javafx.beans.property.SimpleStringProperty;

public class Person
{

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    public Person(String fName, String lName, String email)
    {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName()
    {
        return firstName.get();
    }

    public void setFirstName(String fName)
    {
        firstName.set(fName);
    }

    public String getLastName()
    {
        return lastName.get();
    }

    public void setLastName(String fName)
    {
        lastName.set(fName);
    }

    public String getEmail()
    {
        return email.get();
    }

    public void setEmail(String fName)
    {
        email.set(fName);
    }

}


来源:https://stackoverflow.com/questions/50989771/populating-textfields-with-tableview-data-when-a-line-is-clicked

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!