java - 编写类似代码行的更聪明的方法

标签 java javafx netbeans-8

假设我有一个初始化方法,其中有很多初始化。这是一个例子:

public void initialize(URL url, ResourceBundle rb) {

    date.setCellValueFactory(new PropertyValueFactory("date"));
    site_address.setCellValueFactory(new PropertyValueFactory("site_address"));
    bill_no.setCellValueFactory(new PropertyValueFactory("bill_no"));
    product_name.setCellValueFactory(new PropertyValueFactory("product_name"));
    shade.setCellValueFactory(new PropertyValueFactory("shade"));
    size.setCellValueFactory(new PropertyValueFactory("size"));
    mrp.setCellValueFactory(new PropertyValueFactory("mrp"));
    qty.setCellValueFactory(new PropertyValueFactory("qty"));
    less.setCellValueFactory(new PropertyValueFactory("less"));
    amount.setCellValueFactory(new PropertyValueFactory("amount"));


}

通常我写第一行 date.setCellValueFactory(new PropertyValueFactory("date")); 并复制该行并修改其他行。 这对我来说似乎很奇怪,并且正在考虑一种更好的方法来做到这一点。我的 IDE 是 NetBeans

有没有其他更聪明的方法来处理这个问题?

最佳答案

据我所知,没有什么特别优雅的方法可以做到这一点(除了创建对于手头的任务来说很可能过度杀伤力的结构),而且无论你做什么,在某些时候你必须输入属性和将它们与每一列相关联。我真的不建议子类化 TableColumn 或生成实现自定义接口(interface)的包装类,定义标准 API 中已有的功能。

我通常只是通过编写一个方便的方法并调用它来节省多余的代码。基本思路是

private void configColumn(TableColumn<?,?> column, String property) {
    column.setCellValueFactory(new PropertyValueFactory<>(property));
}

然后你的初始化就变成了

configColumn(date, "date");
configColumn(site_address, "site_address");
// etc ...

提高效率的技巧是最初将列命名为非常短的名称:

private void c(TableColumn<?,?> column, String property) {
    column.setCellValueFactory(new PropertyValueFactory<>(property));
}

现在您需要输入的内容少得多:

c(date, "date");
c(site_address, "site_address");
// ...

然后一旦你把所有这些都放进去,使用你的 IDE 将方法重命名为更易读的东西(我使用 Eclipse,所以你点击定义中的方法名称,选择“Refactor”和“Rename”,然后然后输入新名称。我假设 NetBeans 具有类似的功能。)不要省略这部分,否则当您返回时您的代码将很难阅读。

如果你真的想用某种循环来做到这一点,那么假设你的 TableColumn 都与相应的属性具有相同的名称,你可以使用反射,但我认为你会失去更多可读性比简洁性要好:

public void initialize() throws Exception {
    List<String> colNames = Arrays.asList("date", "site_address", "bill_no" /*, ...*/);

    for (String colName : colNames) {
        Field f = this.getClass().getDeclaredField(colName);
        TableColumn<?,?> column = (TableColumn<?,?>) f.get(this);
        column.setCellValueFactory(new PropertyValueFactory(colName));
    }
}

请注意还有另一种方法,但是(没有一些相当丑陋的接线)你只能在你有权访问 FXMLLoader 的地方使用这个技巧(所以你不能在 Controller 中这样做,只能在加载 FXML 文件的代码中)。 FXMLLoader 提供对 namespace 的访问,它是所有 fx:id 属性值和在 FXML 中创建的对象之间的映射(注意这里还有一些其他键值对,而不仅仅是用 fx:id 定义的键值对)。因此,再次假设您所有的 TableColumn 都具有与属性值匹配的 fx:id 属性值,您可以执行以下操作:

FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/fxml/file"));
Parent root = loader.load();
Map<String, Object> namespace = loader.getNamespace();
for (String fxid : namespace.keySet()) {
    Object value = namespace.get(fxid);
    if (value instanceof TableColumn) {
        ((TableColumn<?,?>)value).setCellValueFactory(new PropertyValueFactory(fxid));
    }
}

关于java - 编写类似代码行的更聪明的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482438/

相关文章:

java - 删除重复的 try/catch 代码

java - 获取添加无法解析或不是字段且 ic_menu_refresh 无法解析或不是字段错误

java - OpenDolphin JavaFX 多窗口

java - 如何在Netbeans(Java)中访问资源文件?

Java 和 PHP - preg_match

java - Apache POI Excel 表格-TotalsRow

java - lambda 表达式应该是最终的 FOR LOOP

java - 为什么 JavaFX 应用程序任务管理器进程在关闭时不会结束

java - 数组异常值未插入

NetBeans 8.2 安装程序找不到 Java SE 开发工具包 (JDK)