Affichage des Éléments d'une Base de données dans un JavaFX TableView
Ok, donc, je suis nouveau à cela et j'ai été à la recherche de deux semaines à essayer d'obtenir un resultset SQL pour imprimer sur une TableView faite par JavaFX Scene Builder. Je peux imprimer mon jeu de résultats en utilisant le Système..println et les données sont correctes, mais quand j'essaie de le mettre dans une Liste, mon tableview affiche une colonne avec des 0 et l'autre colonne vide. Je suis en train d'imprimer la Liste (println), mais j'obtiens le pointeur d'objet(?) et pas les données, donc je ne peux pas voir si je suis de passage à partir du jeu de résultats de la Liste de manière incorrecte.
Toute aide serait appréciée ... je veux comprendre le concept, pas juste avoir une réponse.
Voici mon code de contrôleur:
public class TesterUIController implements Initializable {
@FXML
private TableView<dataClass> Table;
@FXML
private Button TestButton;
@FXML
private TableColumn<dataClass, Integer> colKey;
@FXML
private TableColumn<dataClass, String> colSalesNo;
public static void main (String[] args) {
System.out.println("Main has run");
}
/**
*
* @param fxmlFileLocation
* @param resources
*/
@Override
public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
TestButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Button Pressed");
colKey.setCellValueFactory(new PropertyValueFactory<dataClass, Integer>("Key"));
colSalesNo.setCellValueFactory(new PropertyValueFactory<dataClass, String>("SalesNo"));
Table.getItems().setAll(gobbledyGook());
}
} );
}
/*
* dataClass is a (sub)class representing the data for TableView "Table"
*/
public class dataClass {
private IntegerProperty Key;
public void setKey (int value) {KeyProperty().set(value);}
public int getKey() {
return KeyProperty().get();
}
public IntegerProperty KeyProperty() {
if (Key == null) Key = new SimpleIntegerProperty(this, "Key");
return Key;
}
private StringProperty SalesNo;
public void setSalesNo(String value) {
SalesNoProperty().set(value);
}
public String getSalesNo() {
return SalesNoProperty().get();
}
public StringProperty SalesNoProperty() {
if (SalesNo == null) SalesNo = new SimpleStringProperty(this, "SalesNo");
return SalesNo;
}
}
private List<dataClass> gobbledyGook() { //ObservableList<dataClass> gobbledyGook() { //ResultSet getData() {
Connection conn;
String dbDriver;
Statement st;
ResultSet rs;//= null;
List ll = new LinkedList();
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
dbDriver = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};"
+ "DBQ=Inventario.mdb;";
conn = DriverManager.getConnection(dbDriver, "", "");
st = conn.createStatement();
String getSalesNumber = "SELECT * FROM SalesNumber " //TOP 1 * FROM ...
+ "ORDER BY SalesNumber.Key DESC";//LIMIT 1";
rs = st.executeQuery(getSalesNumber);
while (rs.next()) {
int Key = rs.getInt(1);
double saleNo = rs.getDouble(2);
NumberFormat formatter = new DecimalFormat("###########");
String SalesNo = formatter.format(saleNo);
System.out.println(Key + ", " + SalesNo); //key + ", " + saleNo);
dataClass roww = new dataClass();
ll.add(roww);
}
}
catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(TesterUIController.class.getName()).log(Level.SEVERE, null, ex);
}
return ll;
}
}
OriginalL'auteur John | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Votre Question
Votre table est vide parce que vous n'avez jamais initialiser les valeurs de la
dataClass roww
que vous créez. Essayez le code suivant à la place:Une bien meilleure idée, peut être de fournir un constructeur de la dataClass qui prend la
Key
etSalesNo
que les paramètres de cette façon, votredataClass
instances sont garantis pour être correctement initialisé.Solution De Référence
Voici un lien vers quelques exemple de code pour accéder à une base de données à partir de JavaFX via JDBC et remplissage d'une
ListView
avec les résultats. Le code a été créé pour la StackOverflow question: javafx connexion à mysql.Que le code, similaire au code dans votre question, est simple à comprendre (c'est pourquoi je l'ai lié), mais souffre d'un défaut de la base de données de recherche est effectuée sur le JavaFX application thread. Cela signifie que l'INTERFACE de l'application est bloquée pendant la recherche de base de données se produit. Qui n'est pas optimal. Pour corriger cela, j'ai créé un autre thread d'arrière-plan de la base de données d'accès de l'échantillon pour la stackoverflow question: JavaFX - Thread d'arrière-plan pour la Requête SQL. Cette solution, qui permet d'exécuter des requêtes sur un thread d'arrière-plan à l'aide d'un
Task
, est préférable.De côté
Je conseille suivantes Conventions de nommage Java qu'il va les rendre vos programmes plus facile d'être compris par d'autres développeurs.
OriginalL'auteur jewelsea