web-dev-qa-db-ja.com

Javafxテーブルビューがすべての列にデータを表示していない

OK、Javaは数週間で新しいですが、30年間プログラミングされています。次のコードは実行されますが、最初の列だけが何も表示されていません。データオブジェクトは複数行のデータを表示しています。記入されたデータのフィールドで。私は何かが欠けていると確信しており、ここで同様の質問を調べました。

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

および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>

答えてくれてありがとう。大文字と小文字を区別しない言語での長年の道。これは、私がJavaと最新かつ最高のものを学ぶために、または私が言いたいように、新しいエキサイティングなテクノロジー(NExT!)

答えを見ていて、まだ完全に手がかりがない人のために、コードを正しく機能させるための変更点を以下に示します。

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

この質問は、実際には次の複製です。 Javafx PropertyValueFactoryはTableviewにデータを設定していません ですが、具体的なケースに具体的に対処するので、それは明らかです。

背景

PropertyValueFactory リフレクションを使用して、データ値を取得および設定するメソッドを決定し、モデルクラスからバインド可能なプロパティを取得します。従うパターンは次のとおりです。

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

ここで、「name」はPropertyValueFactoryコンストラクターで指定された文字列です。 getterおよびsetterのプロパティ名の最初の文字は大文字になります(Java Beanの命名規則により)。

アプリケーションが機能しない理由

次の3つの表現があります。

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

サンプルプロパティの場合、PropertyValueFactoryは次のメソッドを検索します。

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

そして、sresultクラスに次の3つのゲッターがあります。

_getDateEntered()
getcDesc()
getEnteredBy()
_

getDateEntered()のみがPropertyValueFactoryによって取得されます。これは、sresultクラスで定義されている唯一の一致するメソッドであるためです。

アドバイス

PropertyValueFactoryでリフレクションを機能させる場合は、Java=標準を採用する必要があります(代わりに、PropertyValueFactoryを使用せずに、独自のセルファクトリを最初から作成する)。

Javaキャメルケースの命名規則 を採用すると、Java開発者がコードを読みやすくなります。

39
jewelsea

上記を通過してもまだ取得できない人にとって、私の問題は、セッターを「パブリックファイナル」の指定で指定していないことでした。

0
Zachary Bennett