ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 更聪明的方式来编写类似的代码行

2019-08-24 09:13:24  阅读:202  来源: 互联网

标签:netbeans-8 java javafx


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

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子类或生成包含定义标准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具有类似的功能.)不要忽略这一部分,否则当你回到它时你的代码将很难阅读.

如果你真的想用某种循环来做这个,那么假设你的TableColumns都与相应的属性具有相同的名称,你可以使用反射,但我认为你的可读性比你简洁得多:

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(所以你不能在控制器中这样做,只能在你加载FXML文件的代码中) . FXMLLoader提供对命名空间的访问,命名空间是所有fx:id属性值和FXML中创建的对象之间的映射(请注意,此处还有一些其他键值对,而不仅仅是用fx定义的那些: ID).因此,再次假设所有TableColumns都具有与属性值匹配的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));
    }
}

标签:netbeans-8,java,javafx
来源: https://codeday.me/bug/20190824/1706744.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有