我可以删除由 ComboBoxListViewSkin 创建的 'carrot'(倒三角形)吗?
Can I remove the 'carrot' (upside down triangle) created by the ComboBoxListViewSkin?
在实施 java ComboBoxListViewSkin class 来管理我的 ComboBox 的弹出侦听器时,这会在 ComboBox 的左上角添加一个 'carrot'(见下文)。如果我删除此 class 实现,它就会消失。我正在使用 CombBoxListViewSkin 的 class 弹出侦听器来防止 [SPACE] 在按下时选择和关闭 ComboBox,这允许将 [SPACE] 字符作为自动完成的一部分键入class.
这是管理和允许 [SPACE] 作为自动完成 class 的一部分工作的所有代码 - 并且效果很好。我已经尝试在 ComboBoxListViewSkin class 中搜索可能会阻止这种情况的方法或属性,但没有解决这个问题。我认为 COMBO_BOX_STYLE_CLASS 可能会提供一些东西,但实际上一切都只管理显示、添加或删除项目。由于下面的代码是重新创建问题所必需的最少代码,因此这不会执行自动完成功能,但它表明删除并重新实现 ComboBoxListViewSkin class 会导致问题......或似乎。
// Main method calling
public class Main extends Application{
public static void main(String[] args) {
launch();
}
public void start(Stage stage) throws Exception {
ComboBox cmb = new ComboBox();
cmb.getItems().setAll("One", "One Two", "One Two Three");
new ComboBoxAutoComplete(cmb);
Scene scene = new Scene(new StackPane(cmb));
stage.setScene(scene);
stage.setTitle("Test GUI");
stage.setWidth(300);
stage.setHeight(300);
stage.show();
}
}
// ComboBoxAutoComplete class with ComboBoxListViewSkin initialization
// Minimal of ComboBoxAutoComplete class constructor
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ComboBox;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import java.util.stream.Stream;
@SuppressWarnings("ALL")
public class ComboBoxAutoComplete<T> {
private ComboBox<T> cmb;
private String filter = "";
private ObservableList<T> originalItems;
private ComboBoxListViewSkin cbSkin;
public ComboBoxAutoComplete(final ComboBox<T> cmb) {
this.cmb = cmb;
originalItems = FXCollections.observableArrayList(cmb.getItems());
cbSkin = new ComboBoxListViewSkin(cmb);
// Aside from the variable declaration and initialization... this
// is the only ComboBoxListViewSkin code to handle the [SPACE]
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if (event.getCode() == KeyCode.SPACE) {
filter += " ";
event.consume();
}
});
}
}
我希望 ComboBox 看起来像应用程序 GUI 中的所有其他 ComboBox。虽然这是一个小问题,但对用户来说,我认为它可能看起来像是应用程序正在发生的问题。
解决:按照Fabian上面的建议,我在初始化之后和事件之前添加了一个cmb.setSkin(cbSkin)过滤并且它起作用了。以为我会 post 这样其他人就会看到它已解决。
cbSkin = new ComboBoxListViewSkin(cmb);
cmb.setSkin(cbSkin); // <------------- ADDED
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if (event.getCode() == KeyCode.SPACE) {
filter += " ";
event.consume();
}
});
在实施 java ComboBoxListViewSkin class 来管理我的 ComboBox 的弹出侦听器时,这会在 ComboBox 的左上角添加一个 'carrot'(见下文)。如果我删除此 class 实现,它就会消失。我正在使用 CombBoxListViewSkin 的 class 弹出侦听器来防止 [SPACE] 在按下时选择和关闭 ComboBox,这允许将 [SPACE] 字符作为自动完成的一部分键入class.
这是管理和允许 [SPACE] 作为自动完成 class 的一部分工作的所有代码 - 并且效果很好。我已经尝试在 ComboBoxListViewSkin class 中搜索可能会阻止这种情况的方法或属性,但没有解决这个问题。我认为 COMBO_BOX_STYLE_CLASS 可能会提供一些东西,但实际上一切都只管理显示、添加或删除项目。由于下面的代码是重新创建问题所必需的最少代码,因此这不会执行自动完成功能,但它表明删除并重新实现 ComboBoxListViewSkin class 会导致问题......或似乎。
// Main method calling
public class Main extends Application{
public static void main(String[] args) {
launch();
}
public void start(Stage stage) throws Exception {
ComboBox cmb = new ComboBox();
cmb.getItems().setAll("One", "One Two", "One Two Three");
new ComboBoxAutoComplete(cmb);
Scene scene = new Scene(new StackPane(cmb));
stage.setScene(scene);
stage.setTitle("Test GUI");
stage.setWidth(300);
stage.setHeight(300);
stage.show();
}
}
// ComboBoxAutoComplete class with ComboBoxListViewSkin initialization
// Minimal of ComboBoxAutoComplete class constructor
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ComboBox;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import java.util.stream.Stream;
@SuppressWarnings("ALL")
public class ComboBoxAutoComplete<T> {
private ComboBox<T> cmb;
private String filter = "";
private ObservableList<T> originalItems;
private ComboBoxListViewSkin cbSkin;
public ComboBoxAutoComplete(final ComboBox<T> cmb) {
this.cmb = cmb;
originalItems = FXCollections.observableArrayList(cmb.getItems());
cbSkin = new ComboBoxListViewSkin(cmb);
// Aside from the variable declaration and initialization... this
// is the only ComboBoxListViewSkin code to handle the [SPACE]
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if (event.getCode() == KeyCode.SPACE) {
filter += " ";
event.consume();
}
});
}
}
我希望 ComboBox 看起来像应用程序 GUI 中的所有其他 ComboBox。虽然这是一个小问题,但对用户来说,我认为它可能看起来像是应用程序正在发生的问题。
解决:按照Fabian上面的建议,我在初始化之后和事件之前添加了一个cmb.setSkin(cbSkin)过滤并且它起作用了。以为我会 post 这样其他人就会看到它已解决。
cbSkin = new ComboBoxListViewSkin(cmb);
cmb.setSkin(cbSkin); // <------------- ADDED
cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
if (event.getCode() == KeyCode.SPACE) {
filter += " ";
event.consume();
}
});