23

javafx2.2のコンボボックスの問題に遭遇しました。これがシナリオです:

  • ユーザーは「editFile」ボタンをクリックします。
  • 別のペインが表示されます(setVisibleメソッドを使用)。

このペインには、6つのコンボボックスが含まれています。そのうちの3つには、cboReport、cboSales、cboSendの固定アイテムがあります。それらのうちの3つは、db(ObservableList)からデータを取得し、ペインが表示されるとデータが入力されます:cboFile、cboCustomer、cboVet

  • ユーザーはcboFileからファイル番号を選択します。残りのコンボボックスは正しい値に設定されています。
  • ユーザーが保存ボタンを押すと、ファイルは意図したとおりに保存されます。
  • 次に、ユーザーは閉じるボタンを押します。

ウィンドウが閉じると、ペイン上のデータはresetGUI_editFilePane()メソッドを介してリセットされます。次のような行があります:

...
cboReport.getSelectionModel().clearSelection();
cboSales.getSelectionModel().clearSelection();
cboSend.getSelectionModel().clearSelection();
cboFile.getSelectionModel().clearSelection();
cboCustomer.getSelectionModel().clearSelection();
cboVet.getSelectionModel().clearSelection();

cboFile.getItems().clear();
cboCustomer.getItems().clear();
cboVet.getItems.clear();
...

ユーザーが「editFile」ボタンを押してペインを再度開くと、「fixed item」コンボボックスのみが選択をクリアしていることに気付きました。動的に塗りつぶされたコンボボックスには、選択自体の値はですが、最後に選択されたアイテムが表示されますnull。これは私にはグラフィックのバグのように見えますか、それとも私は何か間違ったことをしていますか?

この問題を回避する方法はありますか、またはコンボボックスをリセットするための最良の方法は何ですか?

編集2014/08/27:
これは公式にはバグではありません(clearSelection()は値をクリアしません):
https ://bugs.openjdk.java.net/browse/JDK-8097244

公式の「回避策」は、選択をクリアした後にComboBoxの値をクリアすることです。

cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
4

8 に答える 8

25

とても簡単です。ComboBoxのvalueプロパティを操作する必要があります。どうぞ ....

ComboBox c;
c.valueProperty().set(null);

これがあなたのために働くことを願っています:-D

于 2013-12-06T09:48:44.853 に答える
20

私はほぼ同じ状況に遭遇し、解決策を探しているときにあなたの質問に出くわしました。幸い、ComboBoxを強制的にリセットする回避策を思いつきました。次のようなことをする代わりに、ペインのデータをリセットするとき。

cboVet.getSelectionModel().clearSelection();
cboVet.getItems.clear();

このようなことをしてください...

parentNode.getChildren().remove(cboVet);
cboVet = new ComboBox();  // do whatever else you need to format your ComboBox
parentNode.add(cboVet);

また、ComboBoxでsetItems()を再度実行して、新しいものにデータが入力されるようにする必要があります。これは理想的なソリューションではありませんが、提供されているclearSelection()メソッドが期待するとおりに機能しているようです。

于 2012-11-09T19:26:28.290 に答える
8

アイテムを取得して、すべて削除することができます。

cboVet.getItems().removeAll(cboVet.getItems());
于 2013-01-06T14:43:42.427 に答える
3

JavaJDK1.7.11で動作するソリューションをテストしました。

combobox.setSelectedItem(null);
combobox.setValue(null);

それが役に立てば幸い :)

于 2013-03-14T17:09:20.183 に答える
2

ComboBoxスキンのbuttonCellフィールドを直接操作するリフレクションを使用します。

@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> void resetComboBox(ComboBox<T> combo) {
    Skin<?> skin = combo.getSkin();
    if(skin==null){
        return;
    }
    combo.setValue(null);
    Field buttonCellField;
    try {
        buttonCellField = skin.getClass().getDeclaredField("buttonCell");
        buttonCellField.setAccessible(true);
        ListCell buttonCell = (ListCell) buttonCellField.get(skin);
        if(buttonCell!=null){
            StringProperty text = buttonCell.textProperty();
            text.set("");
            buttonCell.setItem(null);
        }
    } catch (NoSuchFieldException 
            | SecurityException 
            | IllegalArgumentException 
            | IllegalAccessException e) {
        e.printStackTrace();
    }

}

buttonCellFactoryプロパティを介して独自のbuttonCell実装を提供することによっても可能だと思います

于 2012-11-19T15:39:56.630 に答える
1

ComboBoxでも同じ問題が発生しました。ComboBoxの項目を変更すると、ComboBoxのbuttonCellが正しく更新されません。これはグラフィックのバグのようです。

ComboBoxのbuttonCellフィールドを直接操作します。

combo.getButtonCell().setText("");
combo.getButtonCell().setItem(null);

これは、ComboBoxを再作成せずに見つけた最良のソリューションです。

于 2013-03-01T16:17:46.713 に答える
1

SelectionModelをクリアするには、Comboboxの新しいインスタンスを作成する以外に何も見つかりませんでした(以前の回答の更新):

myParentNode.getChildren().remove(myCombobox);
myCombobox = new ComboBox();
myParentNode.add(myCombobox);

ただし、このソリューションでは他の問題が発生します。fxmlを使用すると、このコンボボックスが間違った場所に間違ったパラメーターで配置されます。一部のfxmlパラメーターは、コントローラーのクラスコードから直接再現することはほとんどなく、コンボボックスをクリアする必要があるたびに再現するのはひどいことです。

解決策は、これらのコンポーネントが標準であっても、メインコントローラークラスコードで直接インスタンスを作成する代わりに、カスタムコンポーネントを使用することです。これは、コンポーネント関連のイベントメソッドやその他のメソッドをメインコントローラークラスへの参照を使用する別のクラスファイルに移動することで、メインコントローラークラスの一部の行を解放するのにも役立ちます。

JavaFX FXMLアプリケーションでカスタムコンポーネントを作成する方法はhttp://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htmにありますが、アプリケーションのすべてのカスタムコンポーネントにCustomControlExampleクラスが必要なわけではないことに注意してください。 start(Satgeステージ)メソッドを持つエントリポイントクラスがすでにあります。

カスタムコンポーネントコントローラークラスからメインコントローラークラスへの参照で発生する可能性のあるエラーを解決する方法は、JavaFxにあります。CustomComponentControllerクラスからメインコントローラークラスインスタンスを参照する方法は?

于 2013-07-08T16:32:36.573 に答える
1

コンボボックスの選択をクリアする必要があります。そして、このコードは私のために働きました:

 List<Object> list = new ArrayList<>(comboBox.getItems());
 comboBox.getItems().removeAll(list);
 comboBox.getItems().addAll(list);
于 2018-07-03T19:20:04.287 に答える