2013-09-24 73 views
9

OK, mới với java vài tuần, nhưng đã được lập trình trong 30 năm. Đoạn mã sau thực hiện, nhưng chỉ cột đầu tiên hiển thị bất cứ điều gì. Đối tượng dữ liệu đang hiển thị nhiều hàng dữ liệu, với các trường dữ liệu được điền vào. Tôi chắc chắn rằng tôi thiếu một số thứ và đã xem xét các câu hỏi tương tự ở đây.Chế độ xem bảng Javafx không hiển thị dữ liệu trong tất cả các cột

APVoucher_batchgridController.java

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.fxml.Initializable; 
import javafx.fxml.FXML; 
import javafx.scene.control.TableView; 
import javafx.scene.input.MouseEvent; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.cell.PropertyValueFactory; 

/** 
* FXML Controller class 
* 
* @author kmitchell 
*/ 
public class APVoucher_batchgridController implements Initializable { 

    public TableView tblMainList; 
    public TableColumn colDateEntered; 
    public TableColumn colCreatedBy; 
    public TableColumn colDescription; 

    /** 
    * Initializes the controller class. 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

    } 

    @FXML 
    public void opentables(ActionEvent event) { 

     Object forName = null; 
     Connection conn = null; 
     Statement stmt = null; 

     ResultSet rs = null; 

     colDateEntered.setCellValueFactory(new PropertyValueFactory<sresult, String>("DateEntered")); 

     colDescription.setCellValueFactory(new PropertyValueFactory<sresult, String>("cDesc")); 

     colCreatedBy.setCellValueFactory(new PropertyValueFactory<sresult, String>("CreatedBy")); 

     try { 
      // load the driver into memory 
      forName = Class.forName("jstels.jdbc.dbf.DBFDriver2"); 

     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     try { 
      conn = DriverManager.getConnection("jdbc:jstels:dbf:e:\\keystone-data\\keyfund\\seymour\\keyfund.dbc"); 
     } catch (SQLException ex) { 
      Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     if (conn != null) { 
      try { 
       stmt = conn.createStatement(); 
      } catch (SQLException ex) { 
       Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      if (stmt != null) { 

       // execute a query 
       try { 
        ObservableList<Object> data = FXCollections.observableArrayList(); 

        rs = stmt.executeQuery("SELECT denteredon, cdesc, ccreatedby FROM apvbatch WHERE ldeleted = false ORDER BY denteredon DESC"); 

        while (rs.next()) { 

         String enteredon = rs.getString("denteredon"); 
         String desc = rs.getString("cdesc"); 
         String createdby = rs.getString("ccreatedby"); 

         sresult row = new sresult(createdby, enteredon, desc); 

         data.add(row); 
        } 

        tblMainList.setItems(data); 

        tblMainList.setVisible(true); 


       } catch (SQLException ex) { 
        Logger.getLogger(APVoucher_batchgridController.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    } 

    public class sresult { 

     private String DateEntered; 
     private String EnteredBy; 
     private String cDesc; 

     public sresult(String T, String d, String c) { 
      this.EnteredBy = T; 
      this.DateEntered = d; 
      this.cDesc = c; 
     } 

     public String getEnteredBy() { 
      return EnteredBy; 
     } 

     public void setEnteredBy(String T) { 
      EnteredBy = T; 
     } 

     public String getDateEntered() { 
      return DateEntered; 
     } 

     public void setDateEntered(String d) { 
      DateEntered = d; 
     } 

     public String getcDesc() { 
      return cDesc; 
     } 

     public void setcDesc(String c) { 
      cDesc = c; 
     } 
    } 
} 

và APVoucher_batchgrid.fxml

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

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

<AnchorPane id="AnchorPane" fx:id="batchlistform" prefHeight="400.0" prefWidth="600.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="keystone.APVoucher_batchgridController"> 
    <children> 
    <BorderPane layoutX="0.0" layoutY="0.0" prefHeight="400.0" prefWidth="600.0"> 
     <center> 
     <AnchorPane prefHeight="-1.0" prefWidth="-1.0"> 
      <children> 
      <Pane layoutX="0.0" layoutY="0.0" prefHeight="53.0" prefWidth="580.0"> 
       <children> 
       <Label layoutX="7.0" layoutY="9.0" prefWidth="202.0" text="AP Vouchers Batch List"> 
        <font> 
        <Font name="System Bold" size="14.0" /> 
        </font> 
       </Label> 
       <Button fx:id="btnClose" cancelButton="true" layoutX="513.0" layoutY="27.0" mnemonicParsing="false" text="Close" /> 
       <Button id="btnClose" fx:id="apvRefresh" cancelButton="true" layoutX="185.0" layoutY="27.0" mnemonicParsing="false" onAction="#opentables" text="Refresh" /> 
       </children> 
      </Pane> 
      <TableView fx:id="tblMainList" layoutX="0.0" layoutY="53.0" prefHeight="323.0" prefWidth="580.0"> 
       <columns> 
       <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="91.0" text="Date Entered" fx:id="colDateEntered" /> 
       <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="100.0" text="Created By" fx:id="colCreatedBy" /> 
       <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="261.0" text="Description" fx:id="colDescription" /> 
       </columns> 
      </TableView> 
      </children> 
     </AnchorPane> 
     </center> 
     <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
     </padding> 
    </BorderPane> 
    </children> 
    <stylesheets> 
    <URL value="@apvoucher_batchgrid.css" /> 
    </stylesheets> 
</AnchorPane> 

Cảm ơn bạn đã trả lời. Cách nhiều năm trong trường hợp ngôn ngữ không nhạy cảm. Đây là một bài tập nhanh và dơ bẩn cho tôi để tìm hiểu java và những công cụ hay nhất mới nhất của & hoặc như tôi muốn nói Công nghệ Sôi động Mới (NExT!)

Đối với bất cứ ai nhìn vào câu trả lời và vẫn chưa hoàn toàn bị dính vào đây là những thay đổi đã làm cho mã hoạt động đúng cách.

colDateEntered.setCellValueFactory(new PropertyValueFactory<sresult, String>("Denteredon")); 
colDescription.setCellValueFactory(new PropertyValueFactory<sresult, String>("CDesc")); 
colEnteredBy.setCellValueFactory(new PropertyValueFactory<sresult, String>("Ccreatedby")); 


    public class sresult { 

     private String Denteredon; 
     private String Ccreatedby; 
     private String CDesc; 

     public sresult(String T, String d, String c) { 
      this.Ccreatedby = T; 
      this.Denteredon = d; 
      this.CDesc = c; 
     } 

     public String getCcreatedby() { 
      return Ccreatedby; 
     } 

     public void setCreatedby(String T) { 
      Ccreatedby = T; 
     } 

     public String getDenteredon() { 
      return Denteredon; 
     } 

     public void setDenteredon(String d) { 
      Denteredon = d; 
     } 

     public String getCDesc() { 
      return CDesc; 
     } 

     public void setCDesc(String c) { 
      CDesc = c; 
     } 
    } 
} 

Trả lời

29

Câu hỏi này thực sự là bản sao của: Javafx PropertyValueFactory not populating Tableview, nhưng tôi sẽ giải quyết cụ thể trường hợp cụ thể của bạn, vì vậy rõ ràng.

nền

PropertyValueFactory sử dụng phản xạ để xác định các phương pháp để có được và thiết lập các giá trị dữ liệu cũng như để lấy thuộc tính bindable từ lớp mô hình của bạn. Mẫu được theo sau là:

PropertyValueType getName() 
void setName(PropertyValueType value) 
PropertyType nameProperty() 

Trong đó "name" là chuỗi được chỉ định trong hàm tạo PropertyValueFactory. Chữ cái đầu tiên của tên thuộc tính trong getter và setter được viết hoa (theo quy ước đặt tên đậu java).

Tại sao ứng dụng của bạn không hoạt động

Bạn có ba biểu thức:

new PropertyValueFactory<sresult, String>("DateEntered") 
new PropertyValueFactory<sresult, String>("cDesc") 
new PropertyValueFactory<sresult, String>("CreatedBy") 

Đối với tài sản mẫu của bạn, PropertyValueFactory sẽ tìm kiếm những phương pháp:

"DateEntered" => getDateEntered() 
"cDesc" => getCDesc() 
"CreatedBy" => getCreatedBy() 

Và bạn có ba getters trên lớp sresult của mình:

getDateEntered() 
getcDesc() 
getEnteredBy() 

Chỉ getDateEntered() sẽ được chọn bởi PropertyValueFactory vì đó là phương thức khớp duy nhất được xác định trong lớp sresult.

Tư vấn

Bạn sẽ phải áp dụng tiêu chuẩn Java nếu bạn muốn hình ảnh phản chiếu trong PropertyValueFactory làm việc (sự lựa chọn là không sử dụng PropertyValueFactory và thay vào đó viết các nhà máy di động của riêng bạn từ đầu).

Việc áp dụng Java camel case naming conventions cũng giúp các nhà phát triển Java dễ dàng đọc mã của bạn hơn.

+0

@jewelsea bạn có thể giải thích làm thế nào để tạo ra các nhà máy di động của tôi? câu hỏi này của tôi và tôi đang gặp khó khăn ở đây từ một tuần http://stackoverflow.com/questions/43099841/my-javafx-tableview-not-displaying-data-from-my-observablelist chương trình chạy mà không có lỗi và không xuất hiện các dữ liệu trong bảng !! –

0

Đối với bất kỳ ai khác vẫn không nhận được nó sau khi đi qua ở trên, vấn đề của tôi là tôi đã không được quy định cụ thể setters của tôi với "công thức" chỉ định.

+0

không hoàn toàn chắc chắn những gì bạn có nghĩa là - nhưng không có nhu cầu về một modifier "cuối cùng" .. – kleopatra

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