Jul*_*anG 47 java combobox autocomplete javafx-2 javafx-8
我正在寻找一种向JavaFX添加自动完成功能的方法ComboBox.在搜索了很多之后,是时候在这里问了一下.
这AutoFillBox是众所周知的,但不是我正在搜索的内容.我想要的是一个可编辑的组合框,输入列表时应该过滤掉.但是我也希望打开列表而不打字并查看整个项目.
任何的想法?
Mat*_*ari 57
首先,您必须在项目中创建此类:
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.control.ComboBox;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
public class FxUtilTest {
public interface AutoCompleteComparator<T> {
boolean matches(String typedText, T objectToCompare);
}
public static<T> void autoCompleteComboBoxPlus(ComboBox<T> comboBox, AutoCompleteComparator<T> comparatorMethod) {
ObservableList<T> data = comboBox.getItems();
comboBox.setEditable(true);
comboBox.getEditor().focusedProperty().addListener(observable -> {
if (comboBox.getSelectionModel().getSelectedIndex() < 0) {
comboBox.getEditor().setText(null);
}
});
comboBox.addEventHandler(KeyEvent.KEY_PRESSED, t -> comboBox.hide());
comboBox.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
private boolean moveCaretToPos = false;
private int caretPos;
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.UP) {
caretPos = -1;
if (comboBox.getEditor().getText() != null) {
moveCaret(comboBox.getEditor().getText().length());
}
return;
} else if (event.getCode() == KeyCode.DOWN) {
if (!comboBox.isShowing()) {
comboBox.show();
}
caretPos = -1;
if (comboBox.getEditor().getText() != null) {
moveCaret(comboBox.getEditor().getText().length());
}
return;
} else if (event.getCode() == KeyCode.BACK_SPACE) {
if (comboBox.getEditor().getText() != null) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
}
} else if (event.getCode() == KeyCode.DELETE) {
if (comboBox.getEditor().getText() != null) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
}
} else if (event.getCode() == KeyCode.ENTER) {
return;
}
if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT || event.getCode().equals(KeyCode.SHIFT) || event.getCode().equals(KeyCode.CONTROL)
|| event.isControlDown() || event.getCode() == KeyCode.HOME
|| event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
return;
}
ObservableList<T> list = FXCollections.observableArrayList();
for (T aData : data) {
if (aData != null && comboBox.getEditor().getText() != null && comparatorMethod.matches(comboBox.getEditor().getText(), aData)) {
list.add(aData);
}
}
String t = "";
if (comboBox.getEditor().getText() != null) {
t = comboBox.getEditor().getText();
}
comboBox.setItems(list);
comboBox.getEditor().setText(t);
if (!moveCaretToPos) {
caretPos = -1;
}
moveCaret(t.length());
if (!list.isEmpty()) {
comboBox.show();
}
}
private void moveCaret(int textLength) {
if (caretPos == -1) {
comboBox.getEditor().positionCaret(textLength);
} else {
comboBox.getEditor().positionCaret(caretPos);
}
moveCaretToPos = false;
}
});
}
public static<T> T getComboBoxValue(ComboBox<T> comboBox){
if (comboBox.getSelectionModel().getSelectedIndex() < 0) {
return null;
} else {
return comboBox.getItems().get(comboBox.getSelectionModel().getSelectedIndex());
}
}
}
Run Code Online (Sandbox Code Playgroud)
要使您的组合框自动完成,请使用如下:
FxUtilTest.autoCompleteComboBoxPlus(myComboBox, (typedText, itemToCompare) -> itemToCompare.getName().toLowerCase().contains(typedText.toLowerCase()) || itemToCompare.getAge().toString().equals(typedText));
Run Code Online (Sandbox Code Playgroud)
当你需要从组合框中获取选定的值时,请务必使用此方法,否则您可能会遇到一些例外情况,例如"类强制转换异常":
FxUtilTest.getComboBoxValue(myComboBox);
Run Code Online (Sandbox Code Playgroud)
PS:这个方法在jre 8.51和8.65之间的版本中存在一些问题,导致一些奇怪的行为,现在问题似乎不再发生了.如果您遇到某些问题,可以看到对此答案所做的编辑,并获取当时修复问题的旧版本.这个方法必须正常,如果您遇到任何问题,请告诉我.
Jul*_*anG 37
我找到了一个适合我的解决方案:
public class AutoCompleteComboBoxListener<T> implements EventHandler<KeyEvent> {
private ComboBox comboBox;
private StringBuilder sb;
private ObservableList<T> data;
private boolean moveCaretToPos = false;
private int caretPos;
public AutoCompleteComboBoxListener(final ComboBox comboBox) {
this.comboBox = comboBox;
sb = new StringBuilder();
data = comboBox.getItems();
this.comboBox.setEditable(true);
this.comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
comboBox.hide();
}
});
this.comboBox.setOnKeyReleased(AutoCompleteComboBoxListener.this);
}
@Override
public void handle(KeyEvent event) {
if(event.getCode() == KeyCode.UP) {
caretPos = -1;
moveCaret(comboBox.getEditor().getText().length());
return;
} else if(event.getCode() == KeyCode.DOWN) {
if(!comboBox.isShowing()) {
comboBox.show();
}
caretPos = -1;
moveCaret(comboBox.getEditor().getText().length());
return;
} else if(event.getCode() == KeyCode.BACK_SPACE) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
} else if(event.getCode() == KeyCode.DELETE) {
moveCaretToPos = true;
caretPos = comboBox.getEditor().getCaretPosition();
}
if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.LEFT
|| event.isControlDown() || event.getCode() == KeyCode.HOME
|| event.getCode() == KeyCode.END || event.getCode() == KeyCode.TAB) {
return;
}
ObservableList list = FXCollections.observableArrayList();
for (int i=0; i<data.size(); i++) {
if(data.get(i).toString().toLowerCase().startsWith(
AutoCompleteComboBoxListener.this.comboBox
.getEditor().getText().toLowerCase())) {
list.add(data.get(i));
}
}
String t = comboBox.getEditor().getText();
comboBox.setItems(list);
comboBox.getEditor().setText(t);
if(!moveCaretToPos) {
caretPos = -1;
}
moveCaret(t.length());
if(!list.isEmpty()) {
comboBox.show();
}
}
private void moveCaret(int textLength) {
if(caretPos == -1) {
comboBox.getEditor().positionCaret(textLength);
} else {
comboBox.getEditor().positionCaret(caretPos);
}
moveCaretToPos = false;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以用它来调用它
new AutoCompleteComboBoxListener<>(comboBox);
Run Code Online (Sandbox Code Playgroud)
它基于此,我根据自己的需求进行了定制.
如果有人可以改进它,请随意使用它,告诉我.
小智 14
使用ControlsFX库,您可以使用两行代码完成:
comboBox.setEditable(true);
TextFields.bindAutoCompletion(comboBox.getEditor(), comboBox.getItems());
Run Code Online (Sandbox Code Playgroud)
根据Jonatan的回答,我能够构建以下解决方案:
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.List;
public class Main extends Application
{
public static class HideableItem<T>
{
private final ObjectProperty<T> object = new SimpleObjectProperty<>();
private final BooleanProperty hidden = new SimpleBooleanProperty();
private HideableItem(T object)
{
setObject(object);
}
private ObjectProperty<T> objectProperty(){return this.object;}
private T getObject(){return this.objectProperty().get();}
private void setObject(T object){this.objectProperty().set(object);}
private BooleanProperty hiddenProperty(){return this.hidden;}
private boolean isHidden(){return this.hiddenProperty().get();}
private void setHidden(boolean hidden){this.hiddenProperty().set(hidden);}
@Override
public String toString()
{
return getObject() == null ? null : getObject().toString();
}
}
public void start(Stage stage)
{
List<String> countries = new ArrayList<>();
countries.add("Afghanistan");
countries.add("Albania");
countries.add("Algeria");
countries.add("Andorra");
countries.add("Angola");
countries.add("Antigua and Barbuda");
countries.add("Argentina");
countries.add("Armenia");
countries.add("Australia");
countries.add("Austria");
countries.add("Azerbaijan");
countries.add("Bahamas");
countries.add("Bahrain");
countries.add("Bangladesh");
countries.add("Barbados");
countries.add("Belarus");
countries.add("Belgium");
countries.add("Belize");
countries.add("Benin");
countries.add("Bhutan");
countries.add("Bolivia");
countries.add("Bosnia and Herzegovina");
countries.add("Botswana");
countries.add("Brazil");
countries.add("Brunei");
countries.add("Bulgaria");
countries.add("Burkina Faso");
countries.add("Burundi");
countries.add("Cabo Verde");
countries.add("Cambodia");
countries.add("Cameroon");
countries.add("Canada");
countries.add("Central African Republic (CAR)");
countries.add("Chad");
countries.add("Chile");
countries.add("China");
countries.add("Colombia");
countries.add("Comoros");
countries.add("Democratic Republic of the Congo");
countries.add("Republic of the Congo");
countries.add("Costa Rica");
countries.add("Cote d'Ivoire");
countries.add("Croatia");
countries.add("Cuba");
countries.add("Cyprus");
countries.add("Czech Republic");
countries.add("Denmark");
countries.add("Djibouti");
countries.add("Dominica");
countries.add("Dominican Republic");
countries.add("Ecuador");
countries.add("Egypt");
countries.add("El Salvador");
countries.add("Equatorial Guinea");
countries.add("Eritrea");
countries.add("Estonia");
countries.add("Ethiopia");
countries.add("Fiji");
countries.add("Finland");
countries.add("France");
countries.add("Gabon");
countries.add("Gambia");
countries.add("Georgia");
countries.add("Germany");
countries.add("Ghana");
countries.add("Greece");
countries.add("Grenada");
countries.add("Guatemala");
countries.add("Guinea");
countries.add("Guinea-Bissau");
countries.add("Guyana");
countries.add("Haiti");
countries.add("Honduras");
countries.add("Hungary");
countries.add("Iceland");
countries.add("India");
countries.add("Indonesia");
countries.add("Iran");
countries.add("Iraq");
countries.add("Ireland");
countries.add("Israel");
countries.add("Italy");
countries.add("Jamaica");
countries.add("Japan");
countries.add("Jordan");
countries.add("Kazakhstan");
countries.add("Kenya");
countries.add("Kiribati");
countries.add("Kosovo");
countries.add("Kuwait");
countries.add("Kyrgyzstan");
countries.add("Laos");
countries.add("Latvia");
countries.add("Lebanon");
countries.add("Lesotho");
countries.add("Liberia");
countries.add("Libya");
countries.add("Liechtenstein");
countries.add("Lithuania");
countries.add("Luxembourg");
countries.add("Macedonia (FYROM)");
countries.add("Madagascar");
countries.add("Malawi");
countries.add("Malaysia");
countries.add("Maldives");
countries.add("Mali");
countries.add("Malta");
countries.add("Marshall Islands");
countries.add("Mauritania");
countries.add("Mauritius");
countries.add("Mexico");
countries.add("Micronesia");
countries.add("Moldova");
countries.add("Monaco");
countries.add("Mongolia");
countries.add("Montenegro");
countries.add("Morocco");
countries.add("Mozambique");
countries.add("Myanmar (Burma)");
countries.add("Namibia");
countries.add("Nauru");
countries.add("Nepal");
countries.add("Netherlands");
countries.add("New Zealand");
countries.add("Nicaragua");
countries.add("Niger");
countries.add("Nigeria");
countries.add("North Korea");
countries.add("Norway");
countries.add("Oman");
countries.add("Pakistan");
countries.add("Palau");
countries.add("Palestine");
countries.add("Panama");
countries.add("Papua New Guinea");
countries.add("Paraguay");
countries.add("Peru");
countries.add("Philippines");
countries.add("Poland");
countries.add("Portugal");
countries.add("Qatar");
countries.add("Romania");
countries.add("Russia");
countries.add("Rwanda");
countries.add("Saint Kitts and Nevis");
countries.add("Saint Lucia");
countries.add("Saint Vincent and the Grenadines");
countries.add("Samoa");
countries.add("San Marino");
countries.add("Sao Tome and Principe");
countries.add("Saudi Arabia");
countries.add("Senegal");
countries.add("Serbia");
countries.add("Seychelles");
countries.add("Sierra Leone");
countries.add("Singapore");
countries.add("Slovakia");
countries.add("Slovenia");
countries.add("Solomon Islands");
countries.add("Somalia");
countries.add("South Africa");
countries.add("South Korea");
countries.add("South Sudan");
countries.add("Spain");
countries.add("Sri Lanka");
countries.add("Sudan");
countries.add("Suriname");
countries.add("Swaziland");
countries.add("Sweden");
countries.add("Switzerland");
countries.add("Syria");
countries.add("Taiwan");
countries.add("Tajikistan");
countries.add("Tanzania");
countries.add("Thailand");
countries.add("Timor-Leste");
countries.add("Togo");
countries.add("Tonga");
countries.add("Trinidad and Tobago");
countries.add("Tunisia");
countries.add("Turkey");
countries.add("Turkmenistan");
countries.add("Tuvalu");
countries.add("Uganda");
countries.add("Ukraine");
countries.add("United Arab Emirates (UAE)");
countries.add("United Kingdom (UK)");
countries.add("United States of America (USA)");
countries.add("Uruguay");
countries.add("Uzbekistan");
countries.add("Vanuatu");
countries.add("Vatican City (Holy See)");
countries.add("Venezuela");
countries.add("Vietnam");
countries.add("Yemen");
countries.add("Zambia");
countries.add("Zimbabwe");
ComboBox<HideableItem<String>> comboBox = createComboBoxWithAutoCompletionSupport(countries);
comboBox.setMaxWidth(Double.MAX_VALUE);
HBox root = new HBox();
root.getChildren().add(comboBox);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
comboBox.setMinWidth(comboBox.getWidth());
comboBox.setPrefWidth(comboBox.getWidth());
}
public static void main(String[] args)
{
launch();
}
private static <T> ComboBox<HideableItem<T>> createComboBoxWithAutoCompletionSupport(List<T> items)
{
ObservableList<HideableItem<T>> hideableHideableItems = FXCollections.observableArrayList(hideableItem -> new Observable[]{hideableItem.hiddenProperty()});
items.forEach(item ->
{
HideableItem<T> hideableItem = new HideableItem<>(item);
hideableHideableItems.add(hideableItem);
});
FilteredList<HideableItem<T>> filteredHideableItems = new FilteredList<>(hideableHideableItems, t -> !t.isHidden());
ComboBox<HideableItem<T>> comboBox = new ComboBox<>();
comboBox.setItems(filteredHideableItems);
@SuppressWarnings("unchecked")
HideableItem<T>[] selectedItem = (HideableItem<T>[]) new HideableItem[1];
comboBox.addEventHandler(KeyEvent.KEY_PRESSED, event ->
{
if(!comboBox.isShowing()) return;
comboBox.setEditable(true);
comboBox.getEditor().clear();
});
comboBox.showingProperty().addListener((observable, oldValue, newValue) ->
{
if(newValue)
{
@SuppressWarnings("unchecked")
ListView<HideableItem> lv = ((ComboBoxListViewSkin<HideableItem>) comboBox.getSkin()).getListView();
Platform.runLater(() ->
{
if(selectedItem[0] == null) // first use
{
double cellHeight = ((Control) lv.lookup(".list-cell")).getHeight();
lv.setFixedCellSize(cellHeight);
}
});
lv.scrollTo(comboBox.getValue());
}
else
{
HideableItem<T> value = comboBox.getValue();
if(value != null) selectedItem[0] = value;
comboBox.setEditable(false);
Platform.runLater(() ->
{
comboBox.getSelectionModel().select(selectedItem[0]);
comboBox.setValue(selectedItem[0]);
});
}
});
comboBox.setOnHidden(event -> hideableHideableItems.forEach(item -> item.setHidden(false)));
comboBox.getEditor().textProperty().addListener((obs, oldValue, newValue) ->
{
if(!comboBox.isShowing()) return;
Platform.runLater(() ->
{
if(comboBox.getSelectionModel().getSelectedItem() == null)
{
hideableHideableItems.forEach(item -> item.setHidden(!item.getObject().toString().toLowerCase().contains(newValue.toLowerCase())));
}
else
{
boolean validText = false;
for(HideableItem hideableItem : hideableHideableItems)
{
if(hideableItem.getObject().toString().equals(newValue))
{
validText = true;
break;
}
}
if(!validText) comboBox.getSelectionModel().select(null);
}
});
});
return comboBox;
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 9+中,您可以访问ListView以下内容:
ListView<ComboBoxItem> lv = (ListView<ComboBoxItem>) ((ComboBoxListViewSkin<?>) comboBox.getSkin()).getPopupContent();
Run Code Online (Sandbox Code Playgroud)
我发现 Eng Fouad 的 答案是整体上最好的(即使是 10,000 多个项目)但是,我必须修复 3 个错误:
当您单击 时SHIFT,编辑器消失了
当您键入时SPACE,ComboBox将关闭
当您“清除选择”然后打开组合框并关闭它而不选择任何内容时,它会重新选择最后一个项目。
我还添加了一个StringConverter使用 Apache StringUtils的传递,用于比较以及将 Streams 移动到常规 for 循环以达到性能目的:https : //blog.jooq.org/2015/12/08/3-reasons-why -you-shouldnt-replace-your-for-loops-by-stream-foreach/
同样根据Eng Fouad的回答,
在 Java 9+ 中,您可以ListView像这样访问:
ListView<ComboBoxItem> lv = (ListView<ComboBoxItem>) ((ComboBoxListViewSkin<?>) comboBox.getSkin()).getPopupContent();
Run Code Online (Sandbox Code Playgroud)
示例用法:
List<Locale> locales = Arrays.asList(Locale.getAvailableLocales());
ComboBox<HideableItem<Locale>> dropDown = AutoCompleteComboBox.createComboBoxWithAutoCompletionSupport(locales, new StringConverter<HideableItem<Locale>>()
{
@Override
public String toString(HideableItem<Locale> object)
{
if(object!=null)
{
return object.getObject().getDisplayName();
}else
{
return null;
}
}
@Override
public HideableItem<Locale> fromString(String string)
{
Locale foundLocale = locales.stream().filter((Locale i)
-> (i.getDisplayName()).equals(string)).findFirst().orElse(null);
return new HideableItem(foundLocale, this);
}
});
Run Code Online (Sandbox Code Playgroud)
自动完成组合框.java
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import java.util.List;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.event.Event;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.util.StringConverter;
import org.apache.commons.lang3.StringUtils;
public class AutoCompleteComboBox
{
public static class HideableItem<T>
{
private final ObjectProperty<T> object = new SimpleObjectProperty<>();
private final BooleanProperty hidden = new SimpleBooleanProperty();
private StringConverter converter;
public HideableItem(T object, StringConverter converter)
{
setConverter(converter);
setObject(object);
}
private ObjectProperty<T> objectProperty()
{
return this.object;
}
public T getObject()
{
return this.objectProperty().get();
}
private void setObject(T object)
{
this.objectProperty().set(object);
}
private BooleanProperty hiddenProperty()
{
return this.hidden;
}
private boolean isHidden()
{
return this.hiddenProperty().get();
}
private void setHidden(boolean hidden)
{
this.hiddenProperty().set(hidden);
}
private void setConverter(StringConverter converter)
{
this.converter = converter;
}
@Override
public String toString()
{
return getObject() == null ? null : converter.toString(this);
}
}
public static <T> ComboBox<HideableItem<T>> createComboBoxWithAutoCompletionSupport(List<T> items, StringConverter converter)
{
ObservableList<HideableItem<T>> hideableHideableItems = FXCollections.observableArrayList(hideableItem -> new Observable[]
{
hideableItem.hiddenProperty()
});
for (T item : items)
{
HideableItem<T> hideableItem = new HideableItem<>(item, converter);
hideableHideableItems.add(hideableItem);
}
FilteredList<HideableItem<T>> filteredHideableItems = new FilteredList<>(hideableHideableItems, t -> !t.isHidden());
ComboBox<HideableItem<T>> comboBox = new ComboBox<>();
comboBox.setItems(filteredHideableItems);
comboBox.setConverter(converter);
ComboBoxListViewSkin<HideableItem<T>> comboBoxListViewSkin = new ComboBoxListViewSkin<HideableItem<T>>(comboBox);
comboBoxListViewSkin.getPopupContent().addEventFilter(KeyEvent.ANY, (KeyEvent event) ->
{
if (event.getCode() == KeyCode.SPACE)
{
event.consume();
}
});
comboBox.setSkin(comboBoxListViewSkin);
@SuppressWarnings("unchecked")
HideableItem<T>[] selectedItem = (HideableItem<T>[]) new HideableItem[1];
comboBox.addEventHandler(KeyEvent.KEY_PRESSED, event ->
{
if (!comboBox.isShowing() || event.isShiftDown() || event.isControlDown())
{
return;
}
comboBox.setEditable(true);
comboBox.getEditor().clear();
});
comboBox.showingProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) ->
{
if (newValue)
{
@SuppressWarnings("unchecked")
ListView<HideableItem> lv = ((ComboBoxListViewSkin<HideableItem>) comboBox.getSkin()).getListView();
Platform.runLater(() ->
{
if (selectedItem[0] == null) // first use
{
double cellHeight = ((Control) lv.lookup(".list-cell")).getHeight();
lv.setFixedCellSize(cellHeight);
}
});
lv.scrollTo(comboBox.getValue());
} else
{
HideableItem<T> value = comboBox.getValue();
if (value != null)
{
selectedItem[0] = value;
}
comboBox.setEditable(false);
if (value != null)
{
Platform.runLater(() ->
{
comboBox.getSelectionModel().select(selectedItem[0]);
comboBox.setValue(selectedItem[0]);
});
}
}
});
comboBox.setOnHidden((Event event) ->
{
for (HideableItem item : hideableHideableItems)
{
item.setHidden(false);
}
});
comboBox.valueProperty().addListener((ObservableValue<? extends HideableItem<T>> obs, HideableItem<T> oldValue, HideableItem<T> newValue) ->
{
if (newValue == null)
{
for (HideableItem item : hideableHideableItems)
{
item.setHidden(false);
}
}
});
comboBox.getEditor().textProperty().addListener((ObservableValue<? extends String> obs, String oldValue, String newValue) ->
{
if (!comboBox.isShowing())
{
return;
}
Platform.runLater(() ->
{
if (comboBox.getSelectionModel().getSelectedItem() == null)
{
for (HideableItem item : hideableHideableItems)
{
item.setHidden(!StringUtils.containsIgnoreCase(item.toString(), newValue));
}
} else
{
boolean validText = false;
for (HideableItem hideableItem : hideableHideableItems)
{
if (hideableItem.toString().equals(newValue))
{
validText = true;
break;
}
}
if (!validText)
{
comboBox.getSelectionModel().select(null);
}
}
});
});
return comboBox;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46306 次 |
| 最近记录: |