2

我怎样才能只使用List,ArrayListHashMap在它使用的可观察列表中<Person>以及每次新的Person()初始化和表列相同PropertyValueFactory

我怎样才能使用:

 private final ObservableList<Person> data =
    FXCollections.observableArrayList( MyList/HashMap/ArrayList Here);

我很难弄清楚我在哪里犯了错误。

Oracle 文档在这里举了一个例子

private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data =
        FXCollections.observableArrayList(
        new Person("Jacob", "Smith", "jacob.smith@example.com"),
        new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
        new Person("Ethan", "Williams", "ethan.williams@example.com"),
        new Person("Emma", "Jones", "emma.jones@example.com"),
        new Person("Michael", "Brown", "michael.brown@example.com"));


TableColumn emailCol = new TableColumn("Email");
    emailCol.setMinWidth(200);
    emailCol.setCellValueFactory(
        new PropertyValueFactory<Person, String>("email"));

    table.setItems(data);

这是我的代码:

      @FXML
      private TableView<ObservableList> tableViewCOA = new TableView<ObservableList>();

      @FXML
      private TableColumn superTypeNameCol = new TableColumn();

      @FXML
      private TableColumn catagoryNameCol = new TableColumn();

      @FXML
      private TableColumn accountNameCol = new TableColumn();
      @FXML
      private TableColumn accountIDCol = new TableColumn();

  final ObservableList<ObservableList> data = FXCollections.observableArrayList(

        getAllCOA() //<-- myObservableListHere (refer to last method of jdbc)

          );

          superTypeNameCol.setCellValueFactory(
          new PropertyValueFactory<COA,String>("superNameCol")
              );

          catagoryNameCol.setCellValueFactory(
          new PropertyValueFactory<COA,String>("catagoryNameCol")
              );
          accountIDCol.setCellValueFactory(
          new PropertyValueFactory<COA,String>("accountIDCol")
              );
          accountNameCol.setCellValueFactory(
          new PropertyValueFactory<COA,String>("accountNameCol")
              );

          tableViewCOA.setItems(data);

  /*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
  */
  package accountsMain;

  import javafx.beans.property.SimpleStringProperty;

  /**
  *
  * @author u1
  */
  public class COA{


      private final SimpleStringProperty superNameCol;
      private final SimpleStringProperty catagoryNameCol;
      private final SimpleStringProperty accountNameCol;
      private final SimpleStringProperty accountIDCol;


      public COA(String superName,
          String catagoryName,
        String accountName,
        String accountID

          ){


      this.superNameCol   = new SimpleStringProperty(superName);
      this.catagoryNameCol  = new SimpleStringProperty(catagoryName);
      this.accountIDCol  = new SimpleStringProperty(accountID);
      this.accountNameCol   = new SimpleStringProperty(accountName);

      }

      public String getSuperNameCol() {
        return superNameCol.get();
      }
      public void setSuperNameCol(String superName) {
      superNameCol.set(superName);
      }

      public String getCatagoryNameCol() {
        return catagoryNameCol.get();
      }
      public void setCatagoryNameCol(String catagoryName) {
      catagoryNameCol.set(catagoryName);
      }

      public String getAccountIDCol() {
        return accountIDCol.get();
      }
      public void setAccountIDCol(String accountID) {
      accountIDCol.set(accountID);
      }

      public String getAccountNameCol() {
        return accountNameCol.get();
      }
      public void setAccountNameCol(String accountName) {
      accountNameCol.set(accountName);
      }
      }

  ///////////////////////////// this is what returns -----myObservableList-------///////////////////////////////

  public static ObservableList<ObservableList> getAllCOA() {

          Connection con = null;

      //    HashMap rows = new HashMap();
          ObservableList<ObservableList> rows = FXCollections.observableArrayList();

      try {
          Class.forName("com.mysql.jdbc.Driver");
          con = DriverManager.getConnection(
              "jdbc:mysql://"+host+":3306/"+DBname, user, password);


          PreparedStatement pStmt = con.prepareStatement(
        "select "
              + "supercoa.superTypeName,"
              + "catagorycoa.catagoryName,"
              + "accountscoa.accountName,"
              + "accountscoa.account_id"
              + " FROM"
              + " supercoa,catagorycoa,accountscoa"
              + " WHERE"
              + " accountscoa.catagory_id = catagorycoa.catagory_id"
              + " group by accountscoa.accountName");

          ResultSet rs = null;
          rs = pStmt.executeQuery();
          int i = 1;
          while (rs.next()) {

        //  List singleRow = new ArrayList();
          ObservableList<String> singleRow = FXCollections.observableArrayList();
          String supertypeName = rs.getString("supertypeName");  singleRow.add(supertypeName);
          String catagoryName = rs.getString("catagoryName");  singleRow.add(catagoryName);
          String accountName = rs.getString("accountName");  singleRow.add(accountName);
          String account_id = rs.getString("account_id");  singleRow.add(account_id);

          //rows.put(i,singleRow);
          //i++;
          rows.add(singleRow);
          }

          pStmt.close();
          con.close();

          } catch (ClassNotFoundException | SQLException e) {
          main.ErrorLogging.errorLog(e.toString());

          } 
        return rows;
      }

数据未出现,但表格显示为空白列

4

2 回答 2

3

要从 HashMap 填充 TableView,请参阅 TableView 教程部分将数据映射添加到表中。


对于您在问题中提供的示例,最好将getAllCOA()方法的签名更改为:

public static ObservableList<COA> getAllCOA()

此外,当您使用该getAllCOA()方法时,请改为:

final ObservableList<COA> data = getAllCOA();

当您定义表格时,请改用:

private TableView<COA> tableViewCOA = new TableView<COA>();

通过这种方式,您将使用 COA 对象列表,而不仅仅是列表列表。这将允许您创建的单元格值工厂工作。您的单元格值工厂当前无法正常工作,因为它们是为了内省 COA 对象的属性而构建的,并且您没有将 COA 对象放置在表数据中。

于 2012-10-22T20:16:05.823 回答
0

尝试进行类型转换

private final ObservableList<Person> data = (ObservableList<Person>)
    FXCollections.observableArrayList( MyList/HashMap/ArrayList Here);
于 2012-10-22T07:34:54.260 回答