2015-08-20 207 views
1

我試圖將JavaFX ComboBox用作包含歷史記錄的搜索字段。 這是我的代碼示例。javafx組合框項目列表問題

ObservableList<String> patternHistory = FXCollections.observableArrayList(); 
searchComboBox.setItems(patternHistory); 

searchComboBox.valueProperty().addListener((observable, oldValue, newValue) -> { 

    ObservableList<String> history = searchComboBox.getItems(); 

    // This works fine 
    // history.add(newValue); 

    // This does not work 
    history.add(0, newValue); 
}); 

如果我做history.add(newValue)ComboBox的行爲如我所料。 歷史記錄中的最後一項添加到列表的末尾。 但是,我希望最後一個條目首先顯示(我也想刪除重複項並限制歷史記錄大小,但在此示例中我保持簡單)。

所以我決定只需在列表前添加新值history.add(0, newValue)。 但是,當我這樣做時,組合框開始表現出奇怪的方式,並且代碼不再工作。似乎只要我在列表末尾添加/刪除項目,它可以正常工作,但如果我在開頭或中間執行相同操作,則不再有效。

在這裏,我使用lambda表達式語法,但我嘗試了匿名類表示法,它是相同的。我也試圖實現我自己的可觀察列表,並且也有相同的結果。

我目前正在使用JDK 1.8.0_60,但我遇到了早期版本的問題。 有人可以告訴我,如果有辦法解決這個問題,或者如果我做錯了什麼?

+0

看看這個http://stackoverflow.com/questions/26144930/combobox-strange-behaviour-javafx-8/26196751#26196751 – StasKolodyuk

+0

不幸的是,一個選擇框呢不允許用戶輸入新的模式。 – Iceman

回答

1

解決方法似乎是要替換列表中的所有項目。下面似乎工作確定:

import java.util.ArrayList; 
import java.util.List; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class HistoryListComboBox extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ComboBox<String> combo = new ComboBox<>(); 
     combo.getItems().addAll("One", "Two", "Three"); 
     combo.setEditable(true); 
     combo.valueProperty().addListener((obs, oldValue, newValue) -> { 
      if (! combo.getItems().contains(newValue)) { 
       List<String> newItems = new ArrayList<>(); 
       newItems.add(newValue); 
       newItems.addAll(combo.getItems()); 
       combo.getItems().setAll(newItems); 
      } 
     }); 
     StackPane root = new StackPane(combo); 
     primaryStage.setScene(new Scene(root, 350, 120)); 
     primaryStage.show(); 
    } 

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

迄今爲止最好的解決方法。這確實有效。 當我重複使用歷史記錄中的值時,仍然遇到一些問題。我希望它在頂部移動(因爲我打算清除最早的條目),但這不起作用。但是我通過玩'oldValue'找到了一個解決方法。謝謝。 – Iceman