- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这里使用这个例子:
https://stackoverflow.com/a/47933342
我能够创建自动完成下拉搜索,但是当我添加更改监听器以刷新数据库中的数据时,它会被调用 3 次,即使我只选择了一次值。我输入一个国家/地区并单击该国家/地区,输出为:
连接到数据库
连接到数据库
连接到数据库
预期输出是:
连接到数据库
这是我的代码:
package autocomplete;
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;
import java.util.Locale;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
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();
}
}
@Override
public void start(Stage stage)
{
List<String> countries = new ArrayList<>();
for (String countryCode : Locale.getISOCountries())
{
Locale obj = new Locale("", countryCode);
countries.add(obj.getDisplayCountry());
}
ComboBox<HideableItem<String>> comboBox = createComboBoxWithAutoCompletionSupport(countries);
comboBox.setMaxWidth(Double.MAX_VALUE);
comboBox.valueProperty().addListener(new ChangeListener()
{
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue)
{
System.out.println("CONNECT TO DATABASE");
}
});
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;
}
}
编辑:
似乎没有真正的解决方案......所以我最终只是监听 ObjectProperty
而不是监听下拉列表的更改。然后,如果该值不为空,我会更新该属性。
最佳答案
正在通读并看到这个,非常有趣,您看到额外条目的原因如下:
查看 ComboBox/ComboBoxBase 对 editableProperty 的注释是
请注意,当可编辑属性更改时,value 属性以及任何其他相关状态都会重置。
我不确定在键入并关闭组合框时关闭和打开可编辑标志是否有特定原因,但可能您并不真正需要执行此操作。
最后,就我所知,使用 HideableItem 而不重置谓词是否比仅使用字符串并在文本字段值更改时更新谓词更好?我从未见过 FX 中的自动完成功能以这种方式实现,我很好奇。
关于java - ComboBox ChangeListener 在 AutoCompleteDropDown 中被调用 3 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696979/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我有一个包含一些数据的网格(用户列表)。对于每一行,我有许多操作,例如更新、删除、激活、暂停、查看您命名的订单。 而不是放置如此多的按钮,这些按钮将填充超过 400-500像素 我想放置一个组合框,其
在我的一个对话框中,我有以下控制: 我在其他地方填充 ComboBox,如下所示: 但是,如果我没有创建 ComboBox 位,MSI 仍将构
我在项目中为 MVC 使用了 kendo complete。 我有某些形式的国家/地区列表,我显示国家/地区名称,但存储国家/地区代码。 我有以下问题:当用户输入不在列表中的内容时,该值将发送到服务器
我有一个组合框,其中的值是从托管 bean 填充的,如下所示: keywordlist.setConnDB("jdbc:sqlserver://xx.xx.x.xx:1433;DatabaseName
我有一个 ComboBox,它绑定(bind)到 ViewModel 中的复杂类型集合,这些类型的长度可以是任意数量,具体取决于用户的偏好。 我已经创建了一个基于 ComboBox 默认值的样式,并且
我做了一个转换器: public class BooleanToDateConverter implements Converter { private static final long s
编辑:由于 Rob 的回答,我已经更新了下面的代码,现在它可以工作了。 我找到了几页显示如何执行此操作的页面( http://www.cmcrossroads.com/content/view/131
我是 PyQT 的新手。 我有兴趣向 tableView 的每一行添加一个组合框。在 PyQT 4 中可能吗? 我知道,在 QT5 中是可能的,但不确定 PyQT。 预先感谢您的帮助。 最佳答案 如果
我对 JavaFX(8)、HBox、ComboBox 和 HGrow 有问题。 HGrow 不能与 ComboBox 结合使用。 (信息:使用 TextField (而不是 ComboBox),它按预
我有一个 XAML UserControl连接到 ImportPresenter View 模型。有四个ComboBox我的 XAML 中的项目: CashActivityTypeBAI CashAc
我将两个组合框绑定(bind)到同一个 listviewcollection。问题是在一个组合框中选择一个值会导致另一个组合框选定项更改为第一个组合框的确切值。它们是耦合的,我希望它们彼此独立。 My
我正在尝试在 extjs 3.4 中的组合框中的选项之间添加一行。我可以添加该行,但不能用我的远程位置的数据填充它。 (如果我删除修改的 tpl 选项,它就会填充)。 这是我的代码。我只需要在“组”字
我被 WIX 安装程序中的组合框和自定义操作困住了。 我有一个包含几个值的组合框(下拉菜单)。当用户从此下拉列表中选择一个值时,我想在屏幕上显示一些文本(对于下拉列表中的每个项目都是唯一的)。 在 .
我有 ComboBox cbx 和一个包含选项卡的 TabPane(选项卡:t)和一个按钮 b1。因此,单击此按钮 b1 时,它会在 TabPane 中添加一个新选项卡 t,并在包含以下内容的 Com
我有两个组合框:水果和饮料。 fruits 具有字符串:“apple”、“orange”、“banana” drinks 具有字符串:“water”、“coffee”、“juice” 如何制作一个新组
我必须监听什么事件,以便在用户从(可编辑的)WPF ComboBox control 中选择一个选项时得到通知? 我是否必须先访问 Items 属性才能收听 Items.CurrentChanged?
我有以下简单的 QML 组合框: import QtQuick 2.0 import QtQuick.Controls 1.4 import si.mikroelektronika 1.0 Item
当我创建组合框时,列表中没有项目。现在,当我单击下拉按钮时,会调用一个函数(通过 postcommand 选项),但是一旦在我的函数中,我不知道如何在组合框的列表框中设置值。 代码如下: #u
我有两个组合框 我使用 LINQ-to-Entities 来填充 cmbGroup 组合框 Dim db as myDataEntity cmbGroup.ItemsSource = db.Mak
我是一名优秀的程序员,十分优秀!