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

私も同じ問題を抱えてる。バグのようです。sComboBoxを含むa を使用した完全な動作例を次に示します。Locale

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には 3 つすべてが含まれLocale、2 番目の sLocaleが設定されます。

ここに画像の説明を入力

2 回目の入力後、ComboxBox.setValue機能しません:ComboBoxには 3 つすべてが含まれていますLocaleが、2 番目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

コンボ ボックスを作成するときは、ChoiceBox、ListView、TableView などの他の UI コントロールと同様に、ComboBox クラスをインスタンス化し、項目を観察可能なリストとして定義する必要があります。

サンプルコード:

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

combo.setItems(options);

結果は期待どおりになるはずです:)(ローカルマシンでテスト済み)

参考: コンボボックス

于 2012-11-20T23:30:06.043 に答える