2015-01-26 79 views
2

由于我没有提供空的构造函数,因此在使用我的自定义FilterComboBox时遇到了NochSuchMethodException,所以我伸出援手。构造函数期望扩展组合框的Items。将项目集合提供给java中的自定义扩展组合框FXML

ComboBox控件:

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 2015-01-27 16:31:46