当前位置: 首页 > 知识库问答 >
问题:

在JavaFX中编程打开组合框时,如何确定组合框的方向和位置?

石正卿
2023-03-14

当通过编程方式打开组合框时,我遇到了定位和方向方面的问题。因为组合框位于表中的表行内,用户必须在一个单元格中总共单击三次才能打开组合框。为了方便起见,我创建了一个自定义类,允许一键编辑组合框。这很有效!然而,当组合框打开时,结果对话的左上角被塞进所选单元格的左上角,而不仅仅是在组合框的下方,并与组合框对齐。例如:

当用户通过使用鼠标滚轮或单击滚动条并移动它来滚动组合框时,此问题会自行纠正。

另一个有趣的问题是组合框并不总是以正确的方向打开。在UI底部的一个特定的表中,组合框将向下打开,在第1行到第5行中。在第4和第5行中,一旦用户滚动,组合框将移动到组合框上方的正确位置。第4行显示的组合框示例:

private class MyCustomComboBoxTableCell extends TableCell<MyCustomRow, String>{

    private final ComboBox<String> comboBox;

    public MyCustomComboBoxTableCell(ObservableList<String> items){
        this.comboBox = new ComboBox<String>(items);

        comboBox.setOnShown(new EventHandler<Event>(){
            @Override
            public void handle(Event event) {
                getTableView().edit(getIndex(), getTableColumn());
                getTableView().getSelectionModel().clearSelection();
            }
        });

        comboBox.valueProperty().addListener(new ChangeListener<String>(){
            @Override
            public void changed(ObservableValue obs, String oldValue, String newValue) {
                if(newValue != null && !newValue.equals(oldValue)){
                    commitEdit(comboBox.getSelectionModel().getSelectedItem());
                }
            }
        });

        addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent event){
                if(getIndex() < getTableView().getItems().size()){
                    startEdit();
                    comboBox.show();
                }
            }
        });
    }

    @Override
    public void startEdit(){
        super.startEdit();

        setGraphic(comboBox);
        setText(null);
    }

    @Override
    public void cancelEdit(){
        super.cancelEdit();

        setText((String)getItem());
        setGraphic(null);
    }

    @Override 
    public void updateItem(String item, boolean empty){
        super.updateItem(item, empty);
        if(empty){
            setGraphic(null);
        } else {
            if(isEditing()){
                setGraphic(comboBox);
                setText(null);
            } else {
                setGraphic(null);
                setText(getItem());
            }
        }
    }
}

共有1个答案

谭仰岳
2023-03-14

开始编辑时,尚未对组合框进行布局。弹出窗口将根据组合框的当前边界显示,这意味着这些边界很可能是错误的。

tableview上触发布局传递应该可以解决此问题:

addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        if (getIndex() < getTableView().getItems().size()) {
            startEdit();

            // trigger layout pass
            getTableView().applyCss();
            getTableView().layout();

            comboBox.show();
        }
    }
});
 类似资料:
  • 提前谢了。

  • 我正在尝试使用一个可编辑的组合框。因为我想添加一个用于按回车键的监听器。我尝试了下面的选项,但都不起作用。:( < code>cmb_year是组合框对象。

  • 我需要关于设置组合框按钮单元格的帮助。我使用一个组合框来显示可观察列表中的数据,该列表包含两个列的表中的数据,“步骤”和“下一步”(下一步包含一个插入在步骤列中的项目);我需要做的是显示带有“步骤”列表的组合框列表单元格和相对的“下一步”按钮单元格。现在,我可以正确地看到列表单元格,但我的按钮单元格总是空的。 代码: 提前感谢。

  • 我试图创建一个,它将显示所选的预览,但是会显示字符串值。 唯一有效的方法似乎是创建

  • 我想要一个组合框,它会在用户键入时过滤列表项。它应该如下工作: 键入时,文本字段应该显示一个可能的选择,但是用户尚未键入的单词部分应该突出显示。 当他打开列表时,下拉框应该只显示可能的选项? 使用箭头键,用户应该在缩小可能的项目后选择剩余的项目之一。 过滤并不重要,跳转到第一个匹配的选择也可以。 有类似的吗?

  • 我正在用文本对象填充一个组合框。通过使用文本对象而不是字符串,我可以添加一个id值,我可以在程序中使用它,然后在我决定国际化UI时利用它。不管怎样,以下是我正在做的:主课: } 控制器: 测验fxml: 现在,这个很好用。但问题是,当我选择一个项目时,该项目上的文本会变成空白,如下所示: 如果我选择另一个,它也会消失: 我仍然可以选择这些项目,但它们只是不在那里。这是一个错误吗?如果是的话,有办法