当前位置: 首页 > 面试题库 >

JavaFX:使用泛型类型创建动态表视图

乜思淼
2023-03-14
问题内容

因此,首先,我的代码基于该线程中可接受的答案。

我正在尝试从数据库创建一个表视图,并且该表视图应根据用户要求的数据动态填充。到目前为止,尽管工作正常,但我的问题是,从数据库收集的所有值都在Java中解释为字符串,但是我需要它们的实际值。

这样做的原因是javafx tableview的内置排序机制将所有数字排序为字符串,因为填充表时它们的类型会转换为字符串。

示例:值921、200、110、1、2011、1299将被排序为(使用整数数据类型)1、110、200、921、1299、2011,而其将被排序为1,110、1299、200、2011,
921使用字符串数据类型。

我对泛型和Java相当陌生,希望这里有人可以帮助我。

基本上:每当我从数据库中读取一个值时,都需要将其值与实际数据类型一起插入到tableview中,而不是将其转换为字符串。


问题答案:

如果ResultSet.getObject(index)用于填充表格,这应该可以工作。JDBC驱动程序将根据JDBC规范中定义的标准映射返回适当的对象类型(例如,int列将映射到java.lang.Integer,等等)。

我不特别喜欢您链接的代码:它会产生很多有关类型安全的警告,您应该注意这些警告。我会用这样的东西(caveat:未测试):

数据包装器类:

public class DataResult {

    private final List<String> columnNames ;
    private final List<List<Object>> data ;

    public DataResult(List<String> columnNames, List<List<Object>> data) {
        this.columnNames = columnNames ;
        this.data = data ;
    }

    public int getNumColumns() {
        return columnNames.size();
    }

    public String getColumnName(int index) {
        return columnNames.get(index);
    }

    public int getNumRows() {
        return data.size();
    }

    public Object getData(int column, int row) {
        return data.get(row).get(column);
    }

    public List<List<Object>> getData() {
        return data ;
    }
}

数据库访问器类:

public class DAO {

    private Connection conn ;


    public DAO() {
        // initialize connection...
    }

    public DataResult getAllData() throws SQLException {

        List<List<Object>> data = new ArrayList<>();
        List<String> columnNames = new ArrayList<>();

        try (
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("select * from some_table")) {


            int columnCount = rs.getMetaData().getColumnCount();

            for (int i = 1 ; i <= columnCount ; i++) {
                columnNames.add(rs.getMetaData().getColumnName(i));
            }

            while (rs.next()) {
                List<Object> row = new ArrayList<>();
                for (int i = 1 ; i <= columnCount ; i++) {
                    row.add(rs.getObject(i));
                }
                data.add(row);
            }
        }

        return new DataResult(columnNames, data);
    }
}

GUI代码:

TableView<List<Object>> table = new TableView<>();
DAO dao = new DAO();
DataResult data = dao.getAllData();

for (int i = 0 ; i < data.getNumColumns() ; i++) {
    TableColumn<List<Object>, Object> column = new TableColumn<>(data.getColumnName(i));
    int columnIndex = i ;
    column.setCellValueFactory(cellData -> 
        new SimpleObjectProperty<>(cellData.getValue().get(columnIndex)));
    table.getColumns().add(column);
}

table.getItems().setAll(data.getData());

使用此版本,提供给表的数据包含适用于列的适当类型的对象-
不一定是字符串。因此,例如,如果数据库列使用(SQL)类型int定义,则表视图列将包含java.lang.Integer实例,并且排序将根据的实现Integer.compareTo(...)(即,以正确的数字顺序)。



 类似资料:
  • 使用此类型类将地图转换为case类: 此函数用于隐式获取正确的映射器 它可以用作 但我也希望能够将此函数与 Option[Map[]] 或 Future[Map[]] 或 List[Map[]] 一起使用。所以我使用这样的函子实现了一个泛型函数: 但是现在这个函数必须用作 。 但是,我希望能够将该功能用作 无需指定函子类型。这在某种程度上是可能的吗? Shapeless的懒惰可以用来解决这个问题吗

  • 我试图解析spring Version4.3.6中FactoryBean中的泛型类型。我使用FactoryBean创建bean,该bean用于创建任意数量的CarClient实例。 通过构造函数参数1表示的不满足依赖关系;嵌套异常是org.springframework.beans.factory.nouniqueBeanDefinitionException:没有类型为“com.empire.c

  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 问题内容: 如何创建泛型类型的数组?通用方法如何工作?它返回通用数组的副本。因此可以创建通用数组。但是如何?怎么能写一个类似的方法呢? 问题答案: 如果需要在运行时创建它,则至少需要在此时知道类型,因此可以使用以下方法: where 是泛型类型,是的类,并且是初始大小。 这里的文件

  • 我希望有一个泛型类(在类型T中),它保存一个可为空的TS列表。 编译失败,出现以下错误。 错误CS0453:类型't'必须是非空值类型,才能将其用作泛型类型或方法'System.Nullable'中的类型参数't' 我做错了什么?