- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将 CheckComboBox 添加到 controlsfx 库中的 PropertySheet。默认编辑器仅包含 ComboBox 实现。是否可以添加 CheckComboBox?我尝试使用 AbstractPropertyEditor 实现 PropertyEditor 但出现异常。
public static final <T> PropertyEditor<?> createCheckComboBoxEditor(PropertySheet.Item property,
final Collection<T> choices) {
final ObservableList<T> result = FXCollections.observableArrayList();
result.addAll(choices);
CheckComboBox<T> comboBox = new CheckComboBox<T>(result);
return new AbstractPropertyEditor<ObservableList<T>, CheckComboBox<T>>(property, comboBox) {
{
getEditor().getCheckModel().getCheckedItems().setAll(FXCollections.observableArrayList(choices));
}
@Override
public void setValue(ObservableList<T> value) {
getEditor().getCheckModel().getCheckedItems().setAll(value);
}
@Override
protected ObservableValue<ObservableList<T>> getObservableValue() {
return (ObservableValue<ObservableList<T>>) getEditor().getItems();
}
};
}
异常(exception):
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: com.sun.javafx.collections.ObservableListWrapper cannot be cast to javafx.beans.value.ObservableValue
at configurator.ComboBoxEditor$3.getObservableValue(ComboBoxEditor.java:109)
at org.controlsfx.property.editor.AbstractPropertyEditor.<init>(AbstractPropertyEditor.java:83)
at org.controlsfx.property.editor.AbstractPropertyEditor.<init>(AbstractPropertyEditor.java:67)
at configurator.ComboBoxEditor$3.<init>(ComboBoxEditor.java:85)
at configurator.ComboBoxEditor.createCheckComboBoxEditor(ComboBoxEditor.java:85)
at configurator.ConfiguratorController.lambda$setPropertySheetEditors$7(ConfiguratorController.java:273)
at impl.org.controlsfx.skin.PropertySheetSkin$PropertyPane.getEditor(PropertySheetSkin.java:321)
at impl.org.controlsfx.skin.PropertySheetSkin$PropertyPane.setItems(PropertySheetSkin.java:301)
at impl.org.controlsfx.skin.PropertySheetSkin$PropertyPane.<init>(PropertySheetSkin.java:269)
at impl.org.controlsfx.skin.PropertySheetSkin$PropertyPane.<init>(PropertySheetSkin.java:261)
at impl.org.controlsfx.skin.PropertySheetSkin.buildPropertySheetContainer(PropertySheetSkin.java:223)
at impl.org.controlsfx.skin.PropertySheetSkin.refreshProperties(PropertySheetSkin.java:188)
at impl.org.controlsfx.skin.PropertySheetSkin.lambda$new$65(PropertySheetSkin.java:140)
最佳答案
这是一种可能的方法,遵循您实现 AbstractPropertyEditor
的方法用CheckComboBox
控制。
基于HelloCheckComboBox
,我创建了这个示例,使用 Person
类,一个Musicians
bean 和自定义编辑器。
人
public static class Person {
private final StringProperty firstname = new SimpleStringProperty();
private final StringProperty lastname = new SimpleStringProperty();
private final ReadOnlyStringWrapper fullName = new ReadOnlyStringWrapper();
public Person(String firstname, String lastname) {
this.firstname.set(firstname);
this.lastname.set(lastname);
fullName.bind(Bindings.concat(firstname, " ", lastname));
}
public static final ObservableList<Person> createDemoList() {
final ObservableList<Person> result = FXCollections.observableArrayList();
result.add(new Person("Paul", "McCartney"));
result.add(new Person("Andrew Lloyd", "Webber"));
result.add(new Person("Herb", "Alpert"));
result.add(new Person("Emilio", "Estefan"));
result.add(new Person("Bernie", "Taupin"));
result.add(new Person("Elton", "John"));
result.add(new Person("Mick", "Jagger"));
result.add(new Person("Keith", "Richerds"));
return result;
}
public final StringProperty firstnameProperty() {
return this.firstname;
}
public final java.lang.String getFirstname() {
return this.firstnameProperty().get();
}
public final void setFirstname(final String firstname) {
this.firstnameProperty().set(firstname);
}
public final StringProperty lastnameProperty() {
return this.lastname;
}
public final String getLastname() {
return this.lastnameProperty().get();
}
public final void setLastname(final String lastname) {
this.lastnameProperty().set(lastname);
}
public final ReadOnlyStringProperty fullNameProperty() {
return this.fullName.getReadOnlyProperty();
}
public final String getFullName() {
return this.fullNameProperty().get();
}
@Override
public String toString() {
return getFullName();
}
@Override
public int hashCode() {
int hash = 3;
hash = 79 * hash + Objects.hashCode(this.firstname);
hash = 79 * hash + Objects.hashCode(this.lastname);
hash = 79 * hash + Objects.hashCode(this.fullName);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Person other = (Person) obj;
if (!Objects.equals(getFirstname(), other.getFirstname())) {
return false;
}
if (!Objects.equals(getLastname(), other.getLastname())) {
return false;
}
return Objects.equals(this.getFullName(), other.getFullName());
}
}
音乐家
此类包含一个 StringProperty
将使用 TextField
编辑的字段, 和一个 ListProperty<Person>
字段,将使用 CheckComboBox<Person>
进行编辑控制:
public static class Musicians {
private final StringProperty category = new SimpleStringProperty();
private final ListProperty<Person> persons = new SimpleListProperty<>(FXCollections.observableArrayList());
public Musicians() { }
public String getCategory() {
return category.get();
}
public void setCategory(String category) {
this.category.set(category);
}
public StringProperty categoryProperty() {
return category;
}
public void setPersons(ObservableList<Person> value) {
this.persons.set(value);
}
public ObservableList<Person> getPersons() {
return persons.get();
}
public ListProperty<Person> personsProperty() {
return persons;
}
}
CustomPropertyEditorFactory
现在我们提供自己的PropertyEditorFactory
, 使用与 DefaultEditorFactory
相同的文本编辑器对于字符串字段,并添加 CheckComboBox
实现。
请注意,我们必须填充 CheckComboBox
项目列表,在这种情况下将使用 Person.createDemoList()
完成.
public class CustomPropertyEditorFactory implements Callback<Item, PropertyEditor<?>> {
@Override public PropertyEditor<?> call(Item item) {
Class<?> type = item.getType();
if (type == String.class) {
return createTextEditor(item);
}
if (type != null && type == javafx.collections.ObservableList.class) {
return createCheckComboBoxEditor(item, Person.createDemoList());
}
return null;
}
public final PropertyEditor<?> createTextEditor(PropertySheet.Item property) {
return new AbstractPropertyEditor<String, TextField>(property, new TextField()) {
@Override protected StringProperty getObservableValue() {
return getEditor().textProperty();
}
@Override public void setValue(String value) {
getEditor().setText(value);
}
};
}
public final <T> PropertyEditor<?> createCheckComboBoxEditor(PropertySheet.Item property, final Collection<T> choices) {
return new AbstractPropertyEditor<ObservableList<T>, CheckComboBox<T>>(property, new CheckComboBox<>()) {
private ListProperty<T> list;
{
getEditor().getItems().setAll(choices);
}
@Override
protected ListProperty<T> getObservableValue() {
if (list == null) {
list = new SimpleListProperty<>(getEditor().getCheckModel().getCheckedItems());
}
return list;
}
@Override
public void setValue(ObservableList<T> checked) {
checked.forEach(getEditor().getCheckModel()::check);
}
};
}
}
最后,我们可以在我们的应用程序中使用这个自定义工厂:
@Override
public void start(Stage primaryStage) {
PropertySheet propertySheet = new PropertySheet();
propertySheet.setPropertyEditorFactory(new CustomPropertyEditorFactory());
Musicians address = new Musicians();
// 1: set initial selected values:
address.getPersons().add(new Person("Paul", "McCartney"));
// 2: listen to changes in selection:
address.personsProperty().addListener((ors, ov, nv) -> {
System.out.println("Selected persons:");
nv.forEach(System.out::println);
});
propertySheet.getItems().setAll(BeanPropertyUtils.getProperties(address));
Scene scene = new Scene(propertySheet, 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
关于java - 将 CheckComboBox 添加到 PropertySheet JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243863/
我有一个派生自 CPropertySheet 的类,我想在对话框的右下角插入一个“夹具”。 我的对话框已经可以调整大小,只是无法插入夹具。 最佳答案 我不知道是否有任何特殊的 API 可以做到这一点。
我正在使用 Windows API 制作一个 PropertySheet 控件,但出于某种原因,当我单击它们时选项卡会关闭。 例如,如果我添加 4 个标签: 然后,如果我单击除事件选项卡之外的任何选项
我正在编写一个(非托管)C++ 类来包装 Windows PropertySheet .本质上,是这样的: class PropSheet { PROPSHEETHEADER d_header
是否有一种方便的方法来监视属性表项状态?例如文本字段获得焦点、 boolean 状态更改等。 我查看了 javadoc,没有找到。 还有一个issue这里,但解决方案似乎让编辑知道了一个属性的变化。
我正在尝试在我的 Win32 DialogBox 应用程序中使用属性表,以便我可以首先获取用户输入,将其应用于我的类,然后使用该用户输入的规范运行程序。 属性页看起来不错,但我不确定我是否弄错了。 无
我想将 CheckComboBox 添加到 controlsfx 库中的 PropertySheet。默认编辑器仅包含 ComboBox 实现。是否可以添加 CheckComboBox?我尝试使用 A
我实现了一个自定义 PropertySheet,如 here 中所述。 。 所以我有一个主视图,它实现了选择提供程序,并且可以在我的自定义 PropertySheet View 中显示属性。 我现在的
PropertySheet 的 ContolsFX 示例有多个选项。首先,使用 beaninfo 创建一个 bean。在这种情况下,我无法为 PropertySheet 中的每个字段设置类别。我只能在
我认为可以写一个TDI-Application与 MFC CPropertySheet类(class)。这是正确的方法吗,还是有不使用此类的标准方法? 还应该可以在应用程序中包含状态、菜单和工具栏。
为了让 Netbeans 喜欢属性检查器窗口,我正在使用以下类来帮助我实现这一点。 com.l2fprod.common.propertysheet.PropertySheetPanel 到目前为止,
我是一名优秀的程序员,十分优秀!