6

我的问题是,在使用 setValue() 选择后,所选的 ComboBox 项目文本在屏幕上不可见。以下是一些细节: 向我的 CB 添加项目:

combo.getItems().add("a");
combo.getItems().add("b");
combo.getItems().add("c");
combo.getItems().add("d");

之后,当按下按钮 A 时:

combo.setValue(null);

按下按钮 B 时:

combo.setValue("a");

现在,如果我先按下按钮 B,则显示“a”,没关系。之后,如果我按下按钮 A,ComboBox 上不会显示任何文本,没关系。然后我按B,屏幕上的值没有改变。但是,如果我单击 CB,“a”的行将突出显示,combo.getValue() 返回“a”。

有什么建议如何处理吗?

4

3 回答 3

8

我也有同样的问题。它看起来像一个错误。这是一个ComboBox包含Locales 的完整工作示例:

package org.example;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public final class ComboBoxTest extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        // Initialize UI
        stage.setTitle("ComboBox Test");
        final HBox root = new HBox(5.0f);
        final ComboBox<Locale> cbLocales = new ComboBox<>();
        cbLocales.setConverter(new StringConverter<Locale>() {
            @Override
            public String toString(final Locale locale) {
                return locale.getDisplayName();
            }

            @Override
            public Locale fromString(String string) {
                throw new UnsupportedOperationException();
            }
        });
        cbLocales.setPrefWidth(250);
        HBox.setMargin(cbLocales, new Insets(10));
        root.getChildren().add(cbLocales);
        final Button btnFill = new Button("Fill");
        HBox.setMargin(btnFill, new Insets(10));
        root.getChildren().add(btnFill);
        final Scene scene = new Scene(root);
        stage.setScene(scene);

        btnFill.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(final MouseEvent event) {
                // Fill with content
                final List<Locale> locales = Arrays.asList(Locale.ENGLISH,
                        Locale.GERMAN, Locale.FRENCH);
                final Locale defaultLocale = locales.get(1);
                // cbLocales.getItems.setAll(locales) doesn't work
                cbLocales.getItems().clear();
                cbLocales.getItems().addAll(locales);
                // Set default locale
                cbLocales.setValue(defaultLocale);
                cbLocales.setPromptText(cbLocales.getConverter().toString(
                        cbLocales.getValue()));
            }
        });

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

ComboBox一次填充时,一切正常:ComboBox包含所有 3Locale秒,第二个Locale已设置。

在此处输入图像描述

填充第二次后,ComboxBox.setValue不起作用:ComboBox包含所有 3Locale秒但未设置第二Locale个。未选择任何项目,不显示提示。

在此处输入图像描述

我修复了提示问题

// Set default locale
cbLocales.setValue(defaultLocale);
cbLocales.setPromptText(cbLocales.getConverter().toString(
        cbLocales.getValue()));

但它没有选择列表中的项目:

在此处输入图像描述

一个解决方法是:

cbLocales.getSelectionModel().select(defaultLocale);
cbLocales.setPromptText(cbLocales.getConverter().toString(cbLocales.getValue()));

选择项目并设置提示。但我不知道,如果有问题(工具提示或类似)

于 2013-10-04T12:31:28.750 回答
0

我认出了一个奇怪的行为。看起来setItems()在你设置你的“价值”之前不应该这样做......这是一些对我有用的代码:

 ComboBox<String> editableComboBox = new ComboBox<String>(); // <- setting the items here 
                                                             // brings the "bug"
    editableComboBox.setId("combobox_fields" + i);
    String desciption = pair.getDescription();
    editableComboBox.setValue(desciption);
    editableComboBox.setEditable(true); 
    editableComboBox.setItems(FieldType.FIELD_TYPES); // <- here we go!

这里的价值观..

public static final ObservableList<String> FIELD_TYPES =
            FXCollections.observableArrayList("A", "B", "C",
                                              "D", "E", "F",
                                              "G", "H", "I");
于 2015-04-07T03:52:57.987 回答
0

创建组合框时,必须实例化 ComboBox 类并将项目定义为可观察列表,就像其他 UI 控件如 ChoiceBox、ListView 和 TableView 一样。

示例代码:

ObservableList<String> options = 
    FXCollections.observableArrayList("A","B","C","D");

combo.setItems(options);

现在结果应该如你所料:)(在我的本地机器上测试)

参考: 组合框

于 2012-11-20T23:30:06.043 回答