2013-04-26 40 views
5

Ok, vì vậy tôi mới làm điều này, và tôi đã tìm kiếm hai tuần để có được một kết quả SQL để in ra một TableView được tạo bởi JavaFX Scene Builder. Tôi có thể in resultset của tôi bằng cách sử dụng System.out.println và dữ liệu là chính xác, nhưng khi tôi thử đặt nó vào một List, tableview của tôi hiển thị một cột với 0 và cột còn lại trống. Tôi đang cố gắng để in danh sách (println), nhưng tôi nhận được con trỏ đối tượng (?) Và không phải là dữ liệu, vì vậy tôi không thể nhìn thấy nếu tôi đang đi từ ResultSet vào danh sách không chính xác.Hiển thị các mục từ cơ sở dữ liệu trong JavaFX TableView

Bất kỳ trợ giúp nào sẽ được đánh giá cao ... Tôi muốn hiểu khái niệm, không chỉ nhận được câu trả lời.

Đây là mã điều khiển của tôi:

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; 
    } 

} 

Trả lời

5

Vấn đề của bạn

bảng của bạn đang trống vì bạn không bao giờ khởi tạo giá trị của các dataClass roww mà bạn tạo ra. Hãy thử đoạn mã sau thay vì:

dataClass roww = new dataClass(); 
roww.setKey(Key); 
roww.setSalesNo(SalesNo); 
ll.add(roww); 

Một ý tưởng tốt hơn, có thể là để cung cấp một constructor cho dataClass mà mất KeySalesNo như thông số - theo cách đó dataClass trường hợp của bạn được đảm bảo để được khởi tạo một cách chính xác.

ll.add(
    new dataClass(
    Key, 
    SalesNo 
) 
); 

Giải pháp tham khảo

Dưới đây là một liên kết đến một số sample code để truy cập vào cơ sở dữ liệu từ JavaFX qua JDBC và Populating một ListView với kết quả. Mã được tạo cho câu hỏi StackOverflow: javafx connection to mysql.

Mã đó, tương tự như mã trong câu hỏi của bạn, rất dễ hiểu (đó là lý do tại sao tôi liên kết nó), nhưng bị thiếu sót khi tra cứu cơ sở dữ liệu được thực hiện trên chuỗi ứng dụng JavaFX. Điều này có nghĩa là giao diện người dùng ứng dụng bị đóng băng trong khi tra cứu cơ sở dữ liệu xảy ra. Đó không phải là tối ưu. Để khắc phục điều đó, tôi đã tạo một background thread based database access sample khác cho câu hỏi về lưu lượng truy cập stackover: JavaFX - Background Thread for SQL Query. Giải pháp này, thực hiện truy vấn trên một chuỗi nền sử dụng một Task, là thích hợp hơn.

Ngoài

Tôi muốn khuyên sau Java naming conventions vì nó sẽ làm cho chương trình của bạn dễ dàng hơn để được hiểu bởi các nhà phát triển khác.

+0

OMG, CẢM ƠN! Bản sửa lỗi của bạn hoạt động hoàn hảo và các liên kết của bạn đang giúp tôi hiểu được logic đằng sau nơi tôi đã đi sai! Đối với các quy ước đặt tên, tôi biết tôi đã không theo dõi họ, bởi vì tôi chưa học được tất cả, nhưng có, tôi đang làm việc trên đó. Một lần nữa cám ơn! Giúp đỡ tốt nhất tôi đã tìm thấy trong hai tuần đuổi đuôi của tôi! – John

Các vấn đề liên quan