2015-01-26 4 views
2

빈 생성자를 제공하지 않기 때문에 사용자 정의 FilterComboBox를 사용할 때 NochSuchMethodException이 발생하기 때문에 문의하고 있습니다. 생성자는 확장 콤보 박스의 항목을 기대합니다.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)를 호출하는 initialize 메소드를 제공했습니다. 그러나 JavaFX 8의 솔루션을 알고 있으면 좋습니다. – wuz