2017-08-20 51 views
8

Tôi hiện đang làm việc trên một dự án JavaFX. Tôi đang sử dụng Autcomplete TextField của ControlFx. Mỗi lần tôi thêm hàng mới trong bảng cơ sở dữ liệu, cần cập nhật Autocomplete, tôi đã làm điều này nhưng vấn đề của tôi đang hiển thị đôi Context-Menu, chúng tôi có thể nói tự động hoàn thành hai lần vì phương thức i call tạo tự động hoàn tất mỗi lần thêm các phần tử mới trong bảng.Cập nhật tự động hoàn thành JavaFx?

Khi tôi bấm vào một tab editBill tôi gọi phương pháp này:

public void showEditBill() { 

     if (!BillPane.getTabs().contains(EditBillTab)) { 

      BillPane.getTabs().add(EditBillTab); 

     } 
     SingleSelectionModel<Tab> selectionModel = BillPane.getSelectionModel(); 
     selectionModel.select(EditBillTab); 
     /*it should remove the old autocomplete from textfield*/ 
     pushBills(); //Call for cheking new items 
    } 

pushBills() phương pháp:

public void pushBills() { 

    ArrayList list = new ArrayList<>(); 

    bills = new BillHeaderDao().FindAll(); 

    for (int i = 0; i < bills.size(); i++) { 

     list.add(bills.get(i).getIdClient()); 

    } 
    //How can i remove the old bind before bind again 
    autoCompletionBinding = TextFields.bindAutoCompletion(SearchBill, SuggestionProvider.create(list)); 

} 

Làm thế nào tôi có thể loại bỏ các autocomplete cũ và ràng buộc automplete mới ?

Description of problem

Trả lời

2

Chỉ trong bất kỳ trường hợp nếu bạn cần phải giữ thể hiện của đối tượng AutoCompletionTextFieldBinding, như vậy tránh được việc sử dụng:

autoCompleteBinding = TextFields.bindingAutoCompletion(TextField,List); 

, mà sẽ thay đổi Ví dụ, chúng tôi có thể đi sâu hơn một chút và sử dụng điều này:

// let's suppose initially we have this possible values: 
Set<String> autoCompletions = new HashSet<>(Arrays.asList("A", "B", "C")); 
SuggestionProvider<String> provider = SuggestionProvider.create(autoCompletions); 
new AutoCompletionTextFieldBinding<>(textField, provider); 

// and after some times, possible autoCompletions values has changed and now we have: 
Set<String> filteredAutoCompletions = new HashSet<>(Arrays.asList("A", "B")); 

provider.clearSuggestions(); 
provider.addPossibleSuggestions(filteredAutoCompletions); 

Vì vậy, thông qua SuggestionProvider, chúng tôi có các giá trị hoàn thành tự động "được cập nhật". Để tránh tăng gấp đôi trình đơn đề xuất, không sử dụng lại (lần thứ 2):

TextFields.bindAutoCompletion(..) 
+0

Cảm ơn.Điều này hoạt động tốt :) –

+0

Câu trả lời hoàn hảo, cảm ơn bạn. –

+0

Câu trả lời này đã giúp tôi giải quyết nhiều vấn đề của AutoComplete, cảm ơn bạn rất nhiều. –

0

này sẽ làm các trick: Thay vì: TextFields.bindAutoCompletion(textField, list); , hãy thử này:

List<String> strings = new ArrayList<>(); 

sau đó tạo ra ràng buộc giữa TextField của bạn với danh sách thông qua:

new AutoCompletionTextFieldBinding<>(textField, SuggestionProvider.create(strings)); 

Vì vậy, bất kỳ thay đổi nào, bao gồm xóa, khỏi danh sách, sẽ là ted trong autoCompletion của textField; Và bạn sẽ có các đề xuất lọc động, được hiển thị trong cửa sổ bật lên, khi người dùng nhập một số văn bản trong textField;

+0

Vẫn còn vấn đề tương tự. –

0

Tôi đã có cùng một vấn đề một thời gian trước đây tôi cố gắng làm như đề cập @MaxKing, nhưng nó không hoạt động. Tôi đã cố gắng cho nó một solución mặc dù tôi không nghĩ đó là cách đúng đắn.

// Vứt bỏ những ràng buộc cũ và tạo một mới ràng buộc

autoCompleteBinding.dispose();

autoCompleteBinding = TextFields.bindingAutoCompletion (TextField, List);

thử điều này:

public void pushBills() { 

     ArrayList list = new ArrayList<>(); 

     bills = new BillHeaderDao().FindAll(); 

     for (int i = 0; i < bills.size(); i++) { 

      list.add(bills.get(i).getIdClient()); 

     } 
     autoCompletionBinding .dispose(); 
     autoCompletionBinding = TextFields.bindAutoCompletion(SearchBill, SuggestionProvider.create(list)); 
    } 
+0

nó không hoạt động, cùng một vấn đề. –