在这段代码中使用这些匿名块调用超类方法的原因是什么?

时间:2014-06-18 05:39:32

标签: java javafx javafx-8

昨天我在oracle网站上看到了以下链接上的组合框示例:
http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/combo-box.htm#BABJCCIB
在此页面上有一个名为"将Cell Factories应用于组合框" 的部分下的示例。在这个例子中有一个我在这里粘贴的代码: -

priorityComboBox.setCellFactory(
            new Callback<ListView<String>, ListCell<String>>() {
                @Override public ListCell<String> call(ListView<String> param) {
                    final ListCell<String> cell = new ListCell<String>() {
                        {
                            super.setPrefWidth(100);
                        }    
                        @Override public void updateItem(String item, 
                            boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item);    
                                    if (item.contains("High")) {
                                        setTextFill(Color.RED);
                                    }
                                    else if (item.contains("Low")){
                                        setTextFill(Color.GREEN);
                                    }
                                    else {
                                        setTextFill(Color.BLACK);
                                    }
                                }
                                else {
                                    setText(null);
                                }
                            }
                };
                return cell;
            }
        });


在上面的代码中,代码用于调用超类方法setPrefWidth。

{
  super.setPrefWidth(100);
} 

现在我的问题是为什么他们使用匿名代码块来执行此操作。他们可以将该语句放在updateItem方法中 这样做的目的是什么?

1 个答案:

答案 0 :(得分:1)

假设您可以将其插入到updateItem-Method中,但每次更新项目时都会调用它。

这可能不是setPrefWidth的一个大问题,因为没有任何变化,但想象你有firstInitialize();之类的东西,不应该被多次调用。

因此您可以使用初始化程序块。否则你必须首先添加一个像bool isInitialized这样的变量,如果变量是真的,如果不是,你可以执行你的行动。

您还可以查看:Initializing Fields