2017-07-03 7 views
-1

Je souhaite remplir une tableview JavaFX avec le contenu d'une base de données mysql. J'ai créé une liste observable et ajouté des données de table, mais je ne sais pas comment afficher cette liste dans tableview. Voici le code pour la liste,Comment ajouter ObservableList obtenu à partir du serveur Mysql à javaFX Tableview?

public ObservableList<PatientDto> getAllPatientInfo() { 
    ObservableList<PatientDto> list = FXCollections.observableArrayList(); 
    PreparedStatement ps = null; 
    try { 
     String sql = "select * from patient_record"; 
     ps = DbUtil.getConnection().prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()) { 
      PatientDto patientDto = new PatientDto(); 
      patientDto.setPid(rs.getInt("PID")); 
      patientDto.setPatient_Name(rs.getString("Patient_Name")); 
      patientDto.setAddress(rs.getString("Address")); 
      patientDto.setAge(rs.getInt("Age")); 
      patientDto.setDisease(rs.getString("Disease")); 
      patientDto.setDoctor_Name(rs.getString("Doctor_Name")); 
      patientDto.setAdmit_Date(rs.getDate("Admit_date")); 
      patientDto.setDischarge_Date(rs.getDate("Discharge_Date")); 
      list.add(patientDto); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return list; 
} 

J'utilise le constructeur de la scène pour l'interface utilisateur, ce qui est l'interface de mon tableview TableView In scene builder

Et c'est art de ma table dans la base de données MySQL. Table in Mysql server. Je suis débutant dans JavaFX donc je trouve qu'il est difficile de mettre en œuvre les réponses disponibles. Alors s'il vous plaît décrire de manière détaillée.

Répondre

0

d'abord tout ce que vous avez besoin d'une classe de modèle qui contient les informations de la table, permet d'appeler cela comme PatientModel qui ressemble à ceci:

public class PatientModel { 

private StringProperty pid; 
private StringProperty patientName; 
private StringProperty address; 
/* ... 
* and so on... 
*/ 

public PatientModel(String pid, String patientName, String address) { 
    this.pid = new SimpleStringProperty(pid); 
    this.patientName = new SimpleStringProperty(patientName); 
    this.address = new SimpleStringProperty(address); 
} 

public String getPid() { 
    return pid.get(); 
} 

public StringProperty pidProperty() { 
    return pid; 
} 

public String getPatientName() { 
    return patientName.get(); 
} 

public StringProperty patientNameProperty() { 
    return patientName; 
} 

public String getAddress() { 
    return address.get(); 
} 

public StringProperty addressProperty() { 
    return address; 
} 
} 

Ensuite, vous avez besoin d'un fichier .fxml que semblable à ceci:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.layout.AnchorPane?> 
<AnchorPane prefHeight="500.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.91" 
     xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="stackoverflow.TestController"> 
    <TableView fx:id="table"> 
     <columns> 
      <TableColumn fx:id="pidColumn" text="PID"/> 
      <TableColumn fx:id="nameColumn" text="Patient Name"/> 
      <TableColumn fx:id="addressColumn" text="Address"/> 
      <!-- and so on... --> 
     </columns> 
    </TableView> 
</AnchorPane> 

Ensuite, une classe de contrôleur:

public class TestController implements Initializable { 

@FXML 
private TableView<PatientModel> table; 
@FXML 
private TableColumn<PatientModel, String> pidColumn; 
@FXML 
private TableColumn<PatientModel, String> nameColumn; 
@FXML 
private TableColumn<PatientModel, String> addressColumn; 

private ObservableList<PatientModel> tableData = FXCollections.observableArrayList(); 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    initTable(); 
    // if the data is coming from an other class you have probably a list of them, 
    // if not you can simply populate the tableData 
    List<PatientDto> dtosFromDB = new ArrayList<>(); 
    tableData.addAll(dtosFromDB.stream().map(this::convertDtoToModel).collect(Collectors.toList())); 
} 

private void initTable() { 
    table.setItems(tableData); 

    pidColumn.setCellValueFactory(data -> data.getValue().pidProperty()); // here is where tha magic happens :) 

    nameColumn.setCellValueFactory(data -> data.getValue().patientNameProperty()); // this sets the cells value from 
                        // the model. 
    addressColumn.setCellValueFactory(data -> data.getValue().addressProperty()); 
} 

private PatientModel convertDtoToModel(PatientDto dto) { 
    return new PatientModel(dto.getPid().toString(), dto.getName(), dto.getAddress()/* and so on */); 
} 
} 

Après avoir ces classes, vous pouvez simplement charger le .fxml de votre classe principale, alors vous devez compléter avec toutes les informations et cela devrait fonctionner.

P.S. Désolé pour l'indentation, je ne peux pas indenter ici le code entier juste par rangs et c'est tellement ennuyeux.

+0

J'ai aussi une date sql obtenue à partir de datepicker, comment puis-je lier la date dans Stringproperty? – Manoj

+0

avez-vous supposé que cette liste dtosfromDB détient toutes les données de la base de données? – Manoj

+0

Comme je sais que javafx n'a pas de DatePickerTableCell intégré, mais vous pouvez en écrire un. C'est un truc de cartographie, vous devez écrire des méthodes/classes de conversion, alors vous pouvez l'utiliser comme vous le souhaitez. – Sunflame