昨天我在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方法中
这样做的目的是什么?
答案 0 :(得分:1)
假设您可以将其插入到updateItem-Method中,但每次更新项目时都会调用它。
这可能不是setPrefWidth的一个大问题,因为没有任何变化,但想象你有firstInitialize();
之类的东西,不应该被多次调用。
因此您可以使用初始化程序块。否则你必须首先添加一个像bool isInitialized
这样的变量,如果变量是真的,如果不是,你可以执行你的行动。
您还可以查看:Initializing Fields