ComboBox中的项目消失

时间:2013-09-13 22:11:16

标签: java combobox javafx-2 javafx fxml

从JavaFX中使用Scene Builder创建的FXML文件创建ComboBox的自定义单元工厂时遇到以下问题: 我创建了一个标签的自定义单元工厂。当用户点击项目时,它工作正常。 y显示在“按钮”区域中。但是当用户想要点击其他项目时,之前点击的项目就会消失。 Image of the disappeared item

这是组合框细胞工厂的代码:

idCardOnlineStatusComboBox.setCellFactory(new Callback<ListView<Label>, ListCell<Label>>() {
            @Override public ListCell<Label> call(ListView<Label> param) {
               final ListCell<Label> cell = new ListCell<Label>() {   
                    @Override public void updateItem(Label item, 
                        boolean empty) {
                            super.updateItem(item, empty);
                            if(item != null || !empty) {
                                setGraphic(item);
                            }
                        }
            };
            return cell;
        }
    });

我认为细胞工厂存在问题,但我无法弄清楚它在哪里。

我使用以下代码从fxml中提取组合框:

@FXML private ComboBox idCardOnlineStatusComboBox;

然后我用这个填充组合框:

idCardOnlineStatusComboBox.getItems().addAll(
            new Label(Resource.getStringFor("MainForm.Pane.MenuBar.Vortex.OnlineStatus.Online.Title"), new ImageView(onlineImg)),
            new Label(Resource.getStringFor("MainForm.Pane.MenuBar.Vortex.OnlineStatus.Away.Title"), new ImageView(awayImg)),
            new Label(Resource.getStringFor("MainForm.Pane.MenuBar.Vortex.OnlineStatus.DoNotDisturb.Title"), new ImageView(doNotDisturbImg)),
            new Label(Resource.getStringFor("MainForm.Pane.MenuBar.Vortex.OnlineStatus.Invisible.Title"), new ImageView(offlineImg)),
            new Label(Resource.getStringFor("MainForm.Pane.MenuBar.Vortex.OnlineStatus.Offline.Title"), new ImageView(offlineImg))
            );

1 个答案:

答案 0 :(得分:2)

消失的行为可能是一个错误。您可以将其归档到JavaFX Jira,让Oracle人员进一步做出决定。此外,您可以针对此行为的原因调查ComboBox.setCellFactory(...)源代码并找到解决方法。但我的建议是使用ComboBox Cell(ListCell)内部Labelled组件而不是你的组件:

@Override
public void updateItem(Label item, boolean empty) {
    super.updateItem(item, empty);
    if (item != null && !empty) {
        setText(item.getText());
        setGraphic(item.getGraphic());
    } else {
        setText(null);
        setGraphic(null);
    }
}

注意代码的else部分,在编写if语句时涵盖所有用例。