2015-10-06 22 views
0

我已經嘗試了很多,但無法將數據庫中的所有值填充到組合框表格單元格中。在JavaFX中如何在表格視圖中添加組合框數據

Controller.java

public class controller { 
GetConnection gc = new GetConnection(); 
PreparedStatement pst; 
ResultSet rs; 
Statement st; 
private ObservableList<Users> datas = FXCollections.observableArrayList(); 

public controller() { 
} 

@FXML 
private TableView<Users> table; 
@FXML 
private TableColumn<Users, String> c1; 

@FXML 
private void editable() { 
    List<String> names = new ArrayList<String>(); 
    try { 
     ObservableList<Users> datas = FXCollections.observableArrayList(); 
     String sql = "select * from itemsadd"; 
     pst = gc.getConnection().prepareStatement(sql); 
     rs = pst.executeQuery(); 
     while (rs.next()) { 
      String name = rs.getString("itemcode"); 
      names.add(name); 
      System.out.println("probs" + names); 
     } 
     ResultSet rs2 = gc.getConnection().createStatement() 
       .executeQuery("SELECT * FROM itemsadd WHERE itemcode=1001"); 

     while (rs2.next()) { 
      datas.add(new Users(rs2.getString("itemcode"))); 
     } 
     for (String name : names) { 
      c1.setCellValueFactory(new PropertyValueFactory("Itemc")); 
      c1.setCellFactory(ComboBoxTableCell.forTableColumn(name)); 
//not getting full items here 
      System.out.println("hell3" + name);// am getting full items here 
     } 
     table.setItems(null); 
     table.setItems(datas); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error on Building Data"); 
    } 
} 

public static class Users { 
    private StringProperty Itemc; 

    private Users(String Itemc) { 
     this.Itemc = new SimpleStringProperty(Itemc); 
    } 

    public String getItemc() { 
     return Itemc.get(); 
    } 

    public void setItemc(String Itemc) { 
     this.Itemc.set(Itemc); 
    } 

    public StringProperty ItemcProperty() { 
     return Itemc; 
    } 
} 
} 

table.fxml

 <?import java.lang.*?> 
     <?import java.util.*?> 
     <?import javafx.scene.*?> 
     <?import javafx.scene.control.*?> 
     <?import javafx.scene.layout.*?> 

     <AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication47.controller"> 
      <children> 
       <TableView fx:id="table" editable="true" layoutX="136.0" layoutY="58.0" onKeyPressed="#editable" prefHeight="200.0" prefWidth="335.0"> 
       <columns> 
        <TableColumn fx:id="c1" prefWidth="333.0" text="Name" /> 
       </columns> 
       </TableView> 
      </children> 
     </AnchorPane> 

Main.java裝載機

public class Tableveiw extends Application { 
private Stage primaryStage; 
private AnchorPane pane; 

@Override 
public void start(Stage primaryStage) { 
    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle("AddressApp"); 

    showPerson(); 
} 

public void showPerson() { 
    try { 
     // Load root layout from fxml file. 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Tableveiw.class.getResource("table.fxml")); 
     pane = (AnchorPane) loader.load(); 

     // Show the scene containing the root layout. 
     Scene scene = new Scene(pane); 
     primaryStage.setScene(scene); 

     primaryStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

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

數據庫連接 公共類的getConnection {

public Connection getConnection() throws Exception { 

    Connection con = null; 
    try { 

     System.out.println("MySQL Connect Example."); 

     String url = "jdbc:mysql://localhost:3306/"; 
     String dbName = "login"; 
     String driver = "com.mysql.jdbc.Driver"; 
     // Accessing driver from the jar file 
     Class.forName(driver).newInstance(); 
     // Creating a veriable for Connection Called conn 
     con = DriverManager.getConnection(url + dbName, "root", ""); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return con; 

} 

public static void main(String arg[]) { 
    GetConnection con = new GetConnection(); 
    System.out.println("Connection" + con); 

} 
} 

我的代碼的問題是,我沒有得到在數據庫中記錄的全部項目,我的C1組合框的表cell.Am只得到了數據庫的最後一個項目記錄在我的comboboxtablecell.I已創建數組,但仍然沒有幫助。爲什麼我不能將數據庫中的整個項目填充到我的組合框表單中。請幫助我在代碼中進行必要的更改。

+1

你能解釋一下你認爲這段代碼的作用嗎?對我來說完全是無稽之談。你爲什麼要在循環中配置列?爲什麼你要在循環的每個迭代中創建一個新的數據列表?你似乎在用單個項目('names')創建一個'ComboBoxTableCell';這是故意的嗎? –

+1

如果你是新手,開始在底部和小步學習:f.i.首先在tableView中進行簡單的編輯,然後自定義編輯處理程序,然後是專用單元格(如combo),然後在組合中動態列表(和/或在tableView本身中),然後(作爲最後一步)與數據庫交互這與純fx相當獨立)。當你被困在這些步驟時,創建一個SSCCE併發佈一個關於該步驟的問題:-) – kleopatra

+0

SSCCE,SSCCE ... – kleopatra

回答

0

這是基本功能。當你雙擊單元格時,組合框將會顯示,然後你可以選擇value.to直接看到你已經編寫了自己的TableCell類的Combobox類see this you ll understand。我希望這能幫到您。任何?s發表評論

private void editable() { 
    try { 
     ObservableList<String> names = FXCollections.observableArrayList(); 
     ObservableList<Users> datas = FXCollections.observableArrayList(); 
     String sql = "select * from itemsadd"; 
     pst = gc.getConnection().prepareStatement(sql); 
     rs = pst.executeQuery(); 
     while (rs.next()) { 
      String name = rs.getString("itemcode"); 
      names.add(name); 
      System.out.println("probs" + names); 
     } 
     ResultSet rs2 = gc.getConnection().createStatement() 
       .executeQuery("SELECT * FROM itemsadd WHERE itemcode=1001"); 

     while (rs2.next()) { 
      datas.add(new Users(rs2.getString("itemcode"))); 
     } 
     c1.setCellValueFactory(new PropertyValueFactory("Itemc")); 
     c1.setCellFactory(ComboBoxTableCell.forTableColumn(name)); 
     table.setEditable(true); 
     table.getItems().clear(); 
     table.setItems(datas); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error on Building Data"); 
    } 
+1

你的康復.. –

+1

請幫助我http://stackoverflow.com/questions/33031543/how-to-change-values-in-tableview-dynamically-每當我選擇一個相應的 – Seban

+2

我可以舉一個例子嗎?,因爲我可以從你的數據庫中獲取數據嗎?所以我會舉一個例子,你改變你的代碼,不要擔心我會嘗試改變你的代碼tooo。但如果不能抽出時間更改代碼。你需要改變你的代碼,如果它確定讓我知道我會舉一個例子 –

相關問題