2013-09-24 15 views
9

OK, neu in Java um mehrere Wochen, aber seit 30 Jahren programmiert. Der folgende Code wird ausgeführt, aber nur die erste Spalte zeigt etwas an. Das Datenobjekt zeigt mehrere Datenzeilen mit Datenfeldern, die ausgefüllt sind. Ich bin mir sicher, dass ich etwas vermisse und ähnliche Fragen hier durchgesehen habe.Javafx-Tabellenansicht zeigt keine Daten in allen Spalten

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

und 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> 

DANKE für die Antwort. Weg zu vielen Jahren bei unsensiblen Sprachen. Dies war eine schnelle und schmutzige Übung für mich, um Java und die neuesten & größten Sachen zu lernen, oder wie ich gerne sagen New Exciting Technology (NExT!)

Für jeden Blick auf die Antwort und noch nicht vollständig in, hier sind die Änderungen, die den Code richtig funktionieren ließen.

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

Antwort

29

Diese Frage ist wirklich ein Duplikat: Javafx PropertyValueFactory not populating Tableview, aber ich werde speziell auf Ihren speziellen Fall ansprechen, so ist es klar.

Hintergrund

PropertyValueFactory verwendet Reflektion, die Methoden zur Bestimmung bindable Eigenschaften von Ihrem Modell Klasse zu erhalten und setzen Datenwerte sowie abzurufen. Das Muster gefolgt ist:

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

Wo „name“ ist die Zeichenfolge im PropertyValueFactory Konstruktor angegeben. Der erste Buchstabe des Eigenschaftsnamens im Getter und Setter wird großgeschrieben (nach Java-Benennungskonvention).

Warum Ihre Anwendung funktioniert nicht

Sie haben diese drei Ausdrücke:

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

Für Ihre Probeneigenschaften, wird die PropertyValueFactory für diese Methoden aussehen:

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

Und Sie haben diese drei Getter auf Ihrer sresult Klasse:

getDateEntered() 
getcDesc() 
getEnteredBy() 

Nur getDateEntered() wird von der PropertyValueFactory abgeholt werden, weil das das einzige Anpassungsverfahren in der sresult Klasse definiert ist.

Tipps

Sie müssen Java-Standards übernehmen, wenn Sie die Reflexion in PropertyValueFactory arbeiten wollen (die Alternative ist nicht die PropertyValueFactory zu verwenden und stattdessen Ihre eigenen Zellfabriken von Grund auf neu schreiben).

Durch die Übernahme von Java camel case naming conventions können Java-Entwickler Ihren Code leichter lesen.

+0

@jewelsea können Sie erklären, wie Sie meine Zellfabriken erstellen? das ist meine Frage und ich kämpfe hier seit einer Woche http://stackoverflow.com/questions/43099841/my-javafx-tableview-not-displaying-data-from-my-observablelist das Programm läuft ohne einen Fehler und nicht Zeige die Daten in der Tabelle !! –

0

Für alle anderen, die es immer noch nicht bekommen haben, nachdem ich das oben Gesagte durchgearbeitet hatte, bestand mein Problem darin, dass ich meine Setter nicht mit der "Public Final" Bezeichnung bezeichnete.

+0

nicht ganz sicher, was du meinst - aber es gibt keine Notwendigkeit für einen "endgültigen" Modifikator .. – kleopatra