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

将标签和进度条显示到组合框中

万俟浩
2023-03-14

我有这个代码是用来显示文本到组合框。

ProgressBar pb1 = new ProgressBar(0.6);
        ProgressIndicator pi1 = new ProgressIndicator(0.6);
        VBox vb1 = new VBox();
        vb1.getChildren().addAll(new Label("Progressbar 1"), pi1);

        ProgressBar pb2 = new ProgressBar(0.6);
        ProgressIndicator pi2 = new ProgressIndicator(0.6);
        VBox vb2 = new VBox();
        vb2.getChildren().addAll(new Label("Progressbar 2"), pi2);

        ProgressBar pb3 = new ProgressBar(0.6);
        ProgressIndicator pi3 = new ProgressIndicator(0.6);
        VBox vb3 = new VBox();
        vb3.getChildren().addAll(new Label("Progressbar 3"), pi3);


        TextChooser textChooser = new TextChooser(
            vb1, vb2, vb3
        );

        textChooser.setStyle("-fx-font: 10px \"Verdana\";");

        VBox layout = new VBox(textChooser);
        layout.setPadding(new Insets(22, 22, 22, 22));



public static class TextChooser extends StackPane {
        private Label label = new Label();
        private ComboBox<String> combo = new ComboBox<>();

        public TextChooser(String... options) {
            StackPane.setAlignment(label, Pos.CENTER_LEFT);
            StackPane.setAlignment(combo, Pos.CENTER_LEFT);

            label.textProperty().bind(
                combo.getSelectionModel().selectedItemProperty()
            );
            label.visibleProperty().bind(
                combo.visibleProperty().not()
            );
            label.setPadding(new Insets(0, 0, 0, 10));

            combo.getItems().setAll(options);
            combo.getSelectionModel().select(0);
            combo.setVisible(false);

            label.setOnMouseEntered(event -> combo.setVisible(true));
            combo.showingProperty().addListener(observable -> {
                if (!combo.isShowing()) {
                    combo.setVisible(false);
                }
            });
            combo.setOnMouseExited(event -> {
                if (!combo.isShowing()) {
                    combo.setVisible(false);
                }
            });

            getChildren().setAll(label, combo);
        }
    }

在我的情况下,我无法将VBox插入到组合框中。任何想法,我该如何解决这个问题?

共有1个答案

姚丰羽
2023-03-14

您的代码的最大问题是当形参是< code>Strings时,试图使用< code>VBoxes构造< code>TextChooser。将您的构造函数更改为< code>public TextChooser(VBox...options)和< code>ComboBox声明到< code>private ComboBox

现在您将能够将项目添加到组合框中,如果它有效,您就完成了。如果您在将Node添加到ComboBox时遇到问题,您可能需要添加更多代码。问题和解决方案ComboBox的Javadoc中进行了描述:http://docs.oracle.com/javafx/2/api/javafx/scene/control/ComboBox.html.要解决您选择的项目将从组合框中删除的问题,您需要更改此代码(取自javadoc):

combo.setCellFactory(new Callback<ListView<VBox>, ListCell<VBox>>() {
    @Override public ListCell<VBox> call(ListView<VBox> p) {
        return new ListCell<VBox>() {
            @Override protected void updateItem(VBox item, boolean empty) {
                super.updateItem(item, empty);

                if (item == null || empty) {
                    setGraphic(null);
                } else {
                    setGraphic(item);
                }
            }
        };
    }
});

getItems().setAll(options)行之后

这是您的完整示例代码将变成的样子:

    ProgressBar pb1 = new ProgressBar(0.6);
    ProgressIndicator pi1 = new ProgressIndicator(0.6);
    VBox vb1 = new VBox();
    vb1.getChildren().addAll(new Label("Progressbar 1"), pi1);

    ProgressBar pb2 = new ProgressBar(0.6);
    ProgressIndicator pi2 = new ProgressIndicator(0.6);
    VBox vb2 = new VBox();
    vb2.getChildren().addAll(new Label("Progressbar 2"), pi2);

    ProgressBar pb3 = new ProgressBar(0.6);
    ProgressIndicator pi3 = new ProgressIndicator(0.6);
    VBox vb3 = new VBox();
    vb3.getChildren().addAll(new Label("Progressbar 3"), pi3);


    TextChooser textChooser = new TextChooser(
        vb1, vb2, vb3
    );

    textChooser.setStyle("-fx-font: 10px \"Verdana\";");

    VBox layout = new VBox(textChooser);
    layout.setPadding(new Insets(22, 22, 22, 22));



public static class TextChooser extends StackPane {
    private Label label = new Label();
    private ComboBox<VBox> combo = new ComboBox<>();

    public TextChooser(VBox... options) {
        StackPane.setAlignment(label, Pos.CENTER_LEFT);
        StackPane.setAlignment(combo, Pos.CENTER_LEFT);

        label.textProperty().bind(
            combo.getSelectionModel().selectedItemProperty()
        );
        label.visibleProperty().bind(
            combo.visibleProperty().not()
        );
        label.setPadding(new Insets(0, 0, 0, 10));

        combo.getItems().setAll(options);

        // vvvv Begin Optional Part vvvv
        combo.setCellFactory(new Callback<ListView<VBox>, ListCell<VBox>>() {
            @Override public ListCell<VBox> call(ListView<VBox> p) {
                return new ListCell<VBox>() {
                    @Override protected void updateItem(VBox item, boolean empty) {
                        super.updateItem(item, empty);

                        if (item == null || empty) {
                            setGraphic(null);
                        } else {
                            setGraphic(item);
                        }
                    }
                };
            }
        });
        // ^^^^ End Optional Part ^^^^

        combo.getSelectionModel().select(0);
        combo.setVisible(false);

        label.setOnMouseEntered(event -> combo.setVisible(true));
        combo.showingProperty().addListener(observable -> {
            if (!combo.isShowing()) {
                combo.setVisible(false);
            }
        });
        combo.setOnMouseExited(event -> {
            if (!combo.isShowing()) {
                combo.setVisible(false);
            }
        });

        getChildren().setAll(label, combo);
    }
}

 类似资料:
  • 问题内容: 该和不改变自己的价值,方法结束时才。 问题答案: 您正在阻止事件分发线程,这将阻止它更新UI。您可以使用,但Swing是单线程API,这意味着只能从事件分配线程的上下文中对UI进行更新。 您可以使用,这将允许您在后台线程中执行长时间运行的过程,但是它支持将更新安全地同步到UI。 加之其与支持,就很容易进行管理,例如。 “进度窗格” 您可以在EDT中使用/ 支持和更新EDT,支持或工作人

  • 我正在努力让Jasper在图表的条形图上显示值标签。我想生成什么: 我使用Jaspersoft Studio,并在“图表绘图”选项卡中选中了“显示标签”框。出于测试目的,我使用了某种红色和紫色作为项目标签的字体颜色和背景颜色,这在条形图上应该很明显。 我的jrxml文件如下所示: 我还尝试使用定制器,基于一些SO问题: 我没法让它工作,我有上面的条形图,但没有110/760标签。 为了显示这些值,

  • 问题内容: 如何显示来自数据框的堆叠式Barh图表的值?如何将标签放置在每个栏上其相应区域的上方,并修改字体,使其以灰度图形的形式很好地显示? 它与此问题有关,但是它具有一个值列表,而不是从熊猫数据框中提取的两个列表。如果这是一个单列表,我想我可以从数据框中的单个记录中提取值,但可以有两个列表,我不确定如何将其应用于条形图中的每个条形。 我的数据框: 我的代码: 问题答案: 您可以通过注释条与参考

  • 我想创建一个显示为组合框的组列表: 当我添加list groups . set editable(true);默认选定组的标签不可读。你能帮我解决这个问题吗?另外,你能告诉我如何优化这个代码,使之易于使用吗?

  • 我有一个带有进度条的组合框示例。 我想在应用程序运行时显示一个进度条,其中包含正在运行的后台进程。当我将鼠标移到进度条上时,我想看到所有进程。但由于某些原因,代码无法正常工作-当我选择进度条时,没有显示进度条。你能帮我识别这个密码吗。