2016-12-30 56 views
0

有人可以告诉我,为什么一切工作正常,除了在表中显示ID?数据类型有问题吗?从DB的ID不显示

有一个代码,我把数据放到tableView中。

public class TabulkaProdukty { 

    private final FlowPane panelTabulky; 
    public final TableView<Produkty> tabulkaTabulkaProdukty; 
    public ObservableList<Produkty> dataTabulkaProdukty; 
    public static Connection connection; 
    private static Statement statement; 

    public TabulkaProdukty() { 
     panelTabulky = new FlowPane(); 
     tabulkaTabulkaProdukty = new TableView<>(); 
     panelTabulky.getChildren().add(tabulkaTabulkaProdukty); 
     tabulkaTabulkaProdukty.setEditable(true); 
     try { 
      connection = DriverManager.getConnection("jdbc:sqlite:produkty"); 
      statement = connection.createStatement(); 
      statement.executeUpdate("create table if not exists produkty(id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, nazev TEXT NOT NULL, popis TEXT NOT NULL, typ TEXT NOT NULL, cena TEXT NOT NULL);"); 
      dataTabulkaProdukty = FXCollections.observableArrayList(); 
      ResultSet rs = connection.createStatement().executeQuery("SELECT * FROM produkty;"); 
      while (rs.next()) { 
       dataTabulkaProdukty.add(new Produkty(rs.getInt("id"), rs.getString("nazev"), rs.getString("popis"), rs.getString("typ"), rs.getString("cena"))); 
      } 

      // VECI V TABULCE 
      TableColumn idCol = new TableColumn("id"); 
      idCol.setMinWidth(50); 
      idCol.setCellValueFactory(
        new PropertyValueFactory<>("id")); 

      TableColumn nazevCol = new TableColumn("Název"); 
      nazevCol.setMinWidth(100); 
      nazevCol.setCellValueFactory(
        new PropertyValueFactory<>("nazev")); 

      TableColumn popisCol = new TableColumn("Popis"); 
      popisCol.setMinWidth(200); 
      popisCol.setCellValueFactory(
        new PropertyValueFactory<>("popis")); 

      TableColumn typCol = new TableColumn("Typ"); 
      typCol.setMinWidth(50); 
      typCol.setCellValueFactory(
        new PropertyValueFactory<>("typ")); 

      TableColumn cenaCol = new TableColumn("Cena"); 
      cenaCol.setMinWidth(50); 
      cenaCol.setCellValueFactory(
        new PropertyValueFactory<>("cena")); 

      tabulkaTabulkaProdukty.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
      tabulkaTabulkaProdukty.setItems(null); 
      tabulkaTabulkaProdukty.setItems(dataTabulkaProdukty); 
      tabulkaTabulkaProdukty.getColumns().addAll(idCol, nazevCol, popisCol, typCol, cenaCol); 

     } catch (Exception e) { 
      Alert alert = new Alert(Alert.AlertType.ERROR); 
      alert.setTitle("Error dialog"); 
      alert.setHeaderText("Chyba databáze"); 
      alert.setContentText("Nepovedlo se načíst data z databáze."); 
      alert.showAndWait(); 
     } 

    } 

还有一类导航产品

public class Produkty implements Serializable { 

     private final SimpleIntegerProperty id; 
     private final SimpleStringProperty nazev; 
     private final SimpleStringProperty popis; 
     private final SimpleStringProperty typ; 
     private final SimpleStringProperty cena; 
     public NaMinimum panelNaMinimum; 

     public Produkty(int pID, String pNazev, String pPopis, String pTyp, String pCena) { 
      this.id = new SimpleIntegerProperty(pID); 
      this.nazev = new SimpleStringProperty(pNazev); 
      this.popis = new SimpleStringProperty(pPopis); 
      this.typ = new SimpleStringProperty(pTyp); 
      this.cena = new SimpleStringProperty(pCena); 
     } 

     public int getIDProduktu() {return id.get();} 
     public void setIDProduktu(int pID) {id.set(pID);} 
     public String getNazev() {return nazev.get();} 
     public void setNazev(String pNazev) {nazev.set(pNazev);} 
     public String getPopis() {return popis.get();} 
     public void setPopis(String pPopis) {popis.set(pPopis);} 
     public String getTyp() {return typ.get();} 
     public void setTyp(String pTyp) {typ.set(pTyp);} 
     public String getCena() {return cena.get();} 
     public void setCena(String pCena) {cena.set(pCena);} 

    } 

我真的很感激解决的任何建议。

+0

我说成问题 –

回答

2

PropertyValueFactory寻找基于构造函数参数的方法,而不是字段。基于吸气剂的名称,参数应该是"IDProduktu""iDProduktu"

idCol.setCellValueFactory(new PropertyValueFactory<>("IDProduktu")); 

注意,没有财产的getter方法TableView无法观察到的性质的任何改变。在这种情况下,您可以使用普通字段来获得相同的效果。为了观察变化,您需要提供一种名为<property>Property的方法,其中<property>是传递给构造函数PropertyValueFactory的属性名称的占位符,例如,如果你使用"id"作为构造参数:

public IntegerProperty idProperty() { 
    return id; 
} 
+0

非常感谢您的回答,但我仍然不知道如何将其实施到我的代码中。你可以试着实施它吗? –

+0

@HonzíkAzjolHavelka实施什么?第一个代码片段可以用来替换你的'TabulkaProdukty'构造函数中的类似语句('idCol.setCellValueFactory(new PropertyValueFactory <>(“id”));'),第二个代码片段可以粘贴到'Produkty'类(在这种情况下保留'idCol.setCellValueFactory(new PropertyValueFactory <>(“id”));')... – fabian

+0

谢谢!!!!我改变了它,它的工作原理!非常感谢你的耐心! –

0

这将是更好地知道你在做什么,但我的猜测是,整数值没有被显示为一个字符串,因此不像其他参数一样。

+0

嗯,我试图从数据库中获得值到表并显示它。我有和你一样的猜测,但是我在Java编程中很糟糕。这是从实际例子中复制出来的,我不知道,我该怎么做才能说实话。这是愚蠢的功课。 –