2015-01-26 2 views
2

Я обращаюсь к вам, потому что я получаю исключение NochSuchMethodException при использовании моего настраиваемого фильтра FilterComboBox, потому что я не предоставляю пустой конструктор. Конструктор ожидает элементы расширенного combobox.Предоставление коллекции элементов пользовательской расширенной combobox в java FXML

управления выпадающий:

import javafx.beans.value.ObservableValue; 
 
import javafx.collections.FXCollections; 
 
import javafx.collections.ObservableList; 
 
import javafx.scene.control.ComboBox; 
 
import javafx.scene.control.TextField; 
 

 
public class FilterComboBoxTB extends ComboBox<String> { 
 
\t 
 
\t private ObservableList<String> initialList; 
 
\t 
 
\t public FilterComboBoxTB(ObservableList<String> items) { 
 
     super(items); 
 
     super.setEditable(true); 
 
     this.initialList = items; 
 
     this.configAutoFilterListener(); 
 
    } 
 
\t 
 
\t private void configAutoFilterListener() { 
 
\t \t final FilterComboBoxTB currentInstance = this; 
 
     this.getEditor().textProperty().addListener(new ChangeListener<String>() { 
 
      @Override 
 
      public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
 
      \t final TextField editor = currentInstance.getEditor(); 
 
       final String selected = currentInstance.getSelectionModel().getSelectedItem(); 
 
      \t if (selected == null || !selected.equals(editor.getText())) { 
 
      \t \t filterItems(newValue, currentInstance); 
 
       \t currentInstance.show(); 
 
      \t } 
 
      \t 
 
      } 
 
     }); 
 
    } 
 
\t 
 
    private void filterItems(String filter, ComboBox<String> comboBox) { 
 
\t ObservableList<String> filteredList = this.readFromList(filter, initialList); 
 
     comboBox.setItems(filteredList); 
 
    } 
 
\t 
 
\t private ObservableList<String> readFromList(String filter, ObservableList<String> originalList) { 
 
     ObservableList<String> filteredList = FXCollections.observableArrayList(); 
 
     for (String item : originalList) { 
 
     \t if (item.toLowerCase().indexOf(filter.toLowerCase())>-1) {  
 
     \t \t filteredList.add(item); 
 
      } 
 
     } 
 
     return filteredList; 
 
    } 
 
}

FXML-Datei:

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import javafx.scene.layout.BorderPane?> 
 
<?import javafx.scene.control.Label?> 
 
<?import presentation.controls.FilterComboBoxTB?> 
 

 
<BorderPane> 
 
\t <top> 
 
     <FilterComboBoxTB **Method="GetItemsToPassToConstructor()"** /> 
 
    </top> 
 
    <center> 
 
     <Label text="Some data here"/> 
 
    </center> 
 
</BorderPane>

Как указать метод в FXML к получить соответствующий параметр? Большое спасибо и приветствую

ответ

1

В JavaFX 8 (но не в более ранних версиях) вы можете сделать это, аннотируя параметр конструктора @NamedArg. Если вы обновляете свой контроль следующим образом:

public class FilterComboBoxTB extends ComboBox<String> { 

    private ObservableList<String> initialList; 

    public FilterComboBoxTB(@NamedArg("items") ObservableList<String> items) { 
     super(items); 
     // code as before ... 
    } 

    // ... 
} 

Затем в FXML сделать

<FilterComboBoxTB> 
    <items> 
     <FXCollections fx:factory="observableArrayList"> 
      <String value="Item 1" /> 
      <String value="Item 2" /> 
      <String value="Item 3" /> 
     </FXCollections> 
    </items> 
</FilterComboBoxTB> 

(со всем необходимым импортом).

+0

Большое спасибо за предлагаемое решение. Наконец я закончил рефакторинг: Я заменил параметризованный конструктор пустым конструктором и предоставил метод инициализации, вызывающий super.setItems (items); Но полезно знать решение для JavaFX 8. – wuz

Смежные вопросы