- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
错误:类型不匹配:无法从 SimpleStringProperty
转换至ObservableValue<Object>
.
我正在尝试创建一个带有管理各种数据类型的列的 TreeTableView。这意味着每行可以使用三种左右类型的数据之一( String
、 int
、 StringProperty
或 ObjectProperty< LocalDate >
。
假设我的数据类型是“对象”,那么 setCellValueFactory( cellDataFeatures -> { return ...; })
预计 ObservableValue< Object >
。我在尝试从 CellValueFactory 回调的属性中获取所需的 ObservableValue 时不知所措。 :(
This post建议使用 ReadOnlyStringWrapper
但我想保持可编辑的值(在大多数情况下)。我还找到了关于 #asObject()
的建议StringProperty 中不提供的方法。
/*-------------------------+------------+
| columnPeople | columnData |
+-------------------------+------------+
| | |
| + Bob Rozz ============ | 33 ======= |
| + SKILLS | |
| + testskill 1 | 0.7 |
| | 3/14/2017 |
| + testskill 2 | |
| | 0.9 |
| | 3/11/2017 |
| | |
| + Bob Dilly =========== | 34 ======= |
| + SKILLS | |
| + testskill 1 | 0.6 |
| | 3/10/2017 |
| + testskill 2 | |
| | 0.5 |
| | 3/17/2017 |
+-------------------------+------------+
*/
注1:不解决 setCellFactory(...)
还没有。
注2:正如所呈现的,我意识到这个例子是不切实际的。作为所需功能的示例,它与我的项目完全分开。
package testGenericTableTreeColumn;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableCell;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.TextFieldTreeTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Pair;
import javafx.util.converter.DefaultStringConverter;
public class testGenericTableTreeColumn extends javafx.application.Application {
class Skill {
private StringProperty name = new SimpleStringProperty( "" );
public final String getName(){ return this.name.get(); }
public final void setName( String v ){ name.set(v); return; }
public StringProperty nameProperty(){ return this.name; }
private SimpleFloatProperty value = new SimpleFloatProperty( 0f );
public final String getValue(){ return this.name.get(); }
public final void setValue( String v ){ name.set(v); return; }
public StringProperty valueProperty(){ return this.name; }
private SimpleObjectProperty< LocalDate > date = new SimpleObjectProperty< LocalDate >( LocalDate.now() );//LocalDate date = LocalDate.now();
public final String getDate(){ return this.name.get(); }
public final void setDate( String v ){ name.set(v); return; }
public StringProperty dateProperty(){ return this.name; }
public Skill( String name ){
java.util.Random r = new java.util.Random();
this.name .set( name ); //this.name = name;
this.value .set( 100 * ( r.nextFloat() )); //this.value = 100 * ( r.nextFloat() );
this.date .get().minusWeeks( r.nextInt(10) ); //date.minusWeeks( r.nextInt(10) );
return;
}
}
class Person {
private StringProperty name = new SimpleStringProperty( "" );
public final String getName() { return this.name.get(); }
public final void setName( String v ){ name.set(v); return; }
public StringProperty nameProperty() { return this.name; }
private IntegerProperty age = new SimpleIntegerProperty( 0 );
public final int getAge() { return this.age.get(); }
public final void setAge( int v ) { age.set(v); return; }
public IntegerProperty ageProperty() { return this.age; }
public List< Skill > skills = new ArrayList<>();
public Person( String name, int age ){
this.name .set( name );
this.age .set( age );
skills.add( new Skill( "testskill 1" ));
skills.add( new Skill( "testskill 2" ));
return;
}
}
public TreeTableView< Pair< Object, Object >> table = new TreeTableView<>();
@Override public void start( Stage primaryStage ){
TreeItem< Pair< Object, Object >> itemRoot = new TreeItem<>( new Pair<>( "PEOPLE", null ));
this.table.setRoot( itemRoot );
Person person1 = new Person( "Bob Rozz" ,33 );
Person person2 = new Person( "Bob Dilly" ,34 );
List< Person > people = new ArrayList<>();
people.add( person1 );
people.add( person2 );
/*-------------------------+------------+
| columnPeople | columnData |
+-------------------------+------------+
| | |
| + Bob Rozz ============ | 33 ======= |
| + SKILLS | |
| + testskill 1 | 0.7 |
| | 3/14/2017 |
| + testskill 2 | |
| | 0.9 |
| | 3/11/2017 |
| | |
| + Bob Dilly =========== | 34 ======= |
| + SKILLS | |
| + testskill 1 | 0.6 |
| | 3/10/2017 |
| + testskill 2 | |
| | 0.5 |
| | 3/17/2017 |
+-------------------------+------------+
*/
for ( Person person : people ){
TreeItem< Pair< Object, Object >> treeItemPerson = new TreeItem<>( new Pair< Object, Object >( person.nameProperty(), person.ageProperty() ));
TreeItem< Pair< Object, Object >> treeItemSkills = new TreeItem<>( new Pair< Object, Object >( "Skills" , null ));
itemRoot .getChildren().add( treeItemPerson );
treeItemPerson .getChildren().add( treeItemSkills );
for ( Skill skill : person.skills ){
TreeItem< Pair< Object, Object >> treeItemSkillName = new TreeItem<>( new Pair< Object, Object >( null, skill.nameProperty () ));
TreeItem< Pair< Object, Object >> treeItemSkillValue = new TreeItem<>( new Pair< Object, Object >( null, skill.valueProperty () ));
TreeItem< Pair< Object, Object >> treeItemSkillDate = new TreeItem<>( new Pair< Object, Object >( null, skill.dateProperty () ));
treeItemSkills .getChildren().add( treeItemSkillName );
treeItemSkillName .getChildren().add( treeItemSkillDate );
treeItemSkillName .getChildren().add( treeItemSkillValue );
}
}
TreeTableColumn< Pair< Object, Object>, String > colName = new TreeTableColumn<>("People"); colName.setMinWidth(100);
colName.setCellValueFactory( cellDataFeatures -> {
// Could be a String, StringProperty, or ObjectProperty< LocalDate >
Object item = cellDataFeatures.getValue().getValue().getKey();
//String
if ( item instanceof String ){
/* ERROR */ return ( String ) item; //ERROR: Type mismatch: cannot convert from SimpleStringProperty to ObservableValue< Object >
}
//StringProperty
if ( item instanceof StringProperty ){
/* ERROR */ return (( StringProperty ) item ); //ERROR: Type mismatch: cannot convert from SimpleStringProperty to ObservableValue< Object >
}
});
TreeTableColumn< Pair< Object, Object>, Object > colData = new TreeTableColumn<>("Skills"); colData.setMinWidth(200);
colData.setCellValueFactory( cellDataFeatures -> {
//itemKey : Could be a String, IntegerProperty, StringProperty, or ObjectProperty< LocalDate >
Object item = cellDataFeatures.getValue().getValue().getValue();
//String
if ( item instanceof String ){
/* ERROR */ return (String) item; //ERROR: Type mismatch: cannot convert from SimpleStringProperty to ObservableValue< Object >
}
//IntegerProperty
if ( item instanceof IntegerProperty ){
/* ERROR */ return (( IntegerProperty ) item ); //ERROR: Type mismatch: cannot convert from SimpleIntegerProperty to ObservableValue< Object >
}
//StringProperty
if ( item instanceof StringProperty ){
/* ERROR */ return (( StringProperty ) item ); //ERROR: Type mismatch: cannot convert from SimpleStringProperty to ObservableValue< Object >
}
//ObjectProperty< LocalDate >
if ( item instanceof ObjectProperty< ? >){
Object value = (( ObjectProperty<?> ) item ).getBean();
if ( value instanceof LocalDate ){
//@TODO LocalDate cell
}
}
});
/*
//colData.setCellFactory( new Callback< TreeTableColumn< Person, Object >, TreeTableCell< Person, Object >>());
colData.setCellFactory( column -> {
TreeTableCell< Object, Object > cell = new TreeTableCell< Object, Object >(){
@Override protected void updateItem( Object newValue, boolean empty ){
this.setEditable( false );
super.updateItem( newValue, empty );
if ( empty || newValue == null ){
setText ( null );
setGraphic ( null );
return;
}
if ( newValue instanceof String ){
return;
}
this.setEditable( true );
if ( newValue instanceof LocalDate ){
return;
}
return;
} // updateItem( ... );
};
});
// */
// Type safety: A generic array of Table... is created for a varargs
// parameter
// -> @SuppressWarnings("unchecked") to start method!
table.getColumns().addAll( colName, colData );
// Output in console the selected table view's cell value/class to check
// that the data type is correct.
// SystemOutTreeTableViewSelectedCell.set(tableView);
/*
// To check that table view is correctly refreshed on data changed..
final Button agePlusOneButton = new Button("Age +1");
agePlusOneButton.setOnAction((ActionEvent e) -> {
Person<?> person = tableView.getSelectionModel().getSelectedItem();
try {
person.setAge(person.getAge() + 1);
} catch (NullPointerException npe ){
//
}
});
*/
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll( table );
Scene scene = new Scene(new Group());
((Group) scene.getRoot()).getChildren().addAll(vbox);
primaryStage.setWidth(600);
primaryStage.setHeight(750);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
错误:
Description Resource Path Location Type
Type mismatch: cannot convert from IntegerProperty to ObservableValue<Object> testGenericTableTreeColumn.java /testGenericTableTreeColumn/src/testGenericTableTreeColumn line 300 Java Problem
Type mismatch: cannot convert from String to ObservableValue<Object> testGenericTableTreeColumn.java /testGenericTableTreeColumn/src/testGenericTableTreeColumn line 295 Java Problem
Type mismatch: cannot convert from String to ObservableValue<String> testGenericTableTreeColumn.java /testGenericTableTreeColumn/src/testGenericTableTreeColumn line 278 Java Problem
Type mismatch: cannot convert from StringProperty to ObservableValue<Object> testGenericTableTreeColumn.java /testGenericTableTreeColumn/src/testGenericTableTreeColumn line 305 Java Problem
Java 版本:
java version "1.8.0_121" Java(TM)
SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
最佳答案
对于TreeTableColumn<S,T>
,cellValueFactory
类型为Callback<CellDataFeatures<S,T>, ObservableValue<S,T>>
,它本质上是一个采用 CellDataFeatures<S,T>
实例的函数并返回 ObservableValue<S,T>
.
您的colName
是 TreeTableColumn<Pair<Object, Object>, String>
,所以S
是 Pair<Object, Object>
和T
是 String
。所以cellValueFactory
对于 colName
是一个取 CellDataFeatures<Pair<Object, Object>>
的函数实例(您称之为 cellDataFeatures
)并返回 ObservableValue<String>
.
您的实现存在多个问题。第一个是如果item
,声明为 Object
,不是 String
的实例或StringProperty
,那么代码实际上永远不会达到 return
陈述。所以这甚至不是一个有效的 lambda 表达式。
第二个问题是如果item
是 String
实例(第一个 if
语句),您返回 String
,这不是 ObservableValue<String>
,因此您返回了错误的类型。
因此至少可以编译的实现是
TreeTableColumn< Pair< Object, Object>, String > colName = new TreeTableColumn<>("People"); colName.setMinWidth(100);
colName.setCellValueFactory( cellDataFeatures -> {
// Could be a String, StringProperty, or ObjectProperty< LocalDate >
Object item = cellDataFeatures.getValue().getValue().getKey();
//String
if ( item instanceof String ){
return new SimpleStringProperty(( String ) item);
}
//StringProperty
if ( item instanceof StringProperty ){
return (( StringProperty ) item );
}
// must return something: you probably don't want to return null though, so you should fix this as needed.
return null ;
});
类似地,对于 colData
,您的代码路径永远不会到达 return 语句,因此您尚未定义有效的 lambda 表达式。在这种情况下,colData
是 TreeTableColumn<Pair<Object, Object>, Object>
,所以T
是 Object
,返回类型必须为 ObservableValue<Object>
。您的各种if
阻止尝试返回 String
, IntegerProperty
, StringProperty
,(或待确定的东西),并且这些都不是 ObservableValue<Object>
的实例。
实际编译的实现是
TreeTableColumn< Pair< Object, Object>, Object > colData = new TreeTableColumn<>("Skills"); colData.setMinWidth(200);
colData.setCellValueFactory( cellDataFeatures -> {
//itemKey : Could be a String, IntegerProperty, StringProperty, or ObjectProperty< LocalDate >
Object item = cellDataFeatures.getValue().getValue().getValue();
//String
if ( item instanceof String ){
return new SimpleObjectProperty<>( item );
}
//IntegerProperty
if ( item instanceof IntegerProperty ){
return new SimpleObjectProperty<>(((IntegerProperty) item).getValue());
}
//StringProperty
if ( item instanceof StringProperty ){
return new SimpleObjectProperty<>(((IntegerProperty) item).getValue());
}
//ObjectProperty< LocalDate >
if ( item instanceof ObjectProperty< ? >){
Object value = (( ObjectProperty<?> ) item ).getBean();
if ( value instanceof LocalDate ){
//@TODO LocalDate cell
}
}
// TODO return something appropriate here
return null ;
});
关于java - 使用通用对象类型的 TableColumn 的 CellValueFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42933486/
String[] titles = {"System Code","Domain Name","Organizational Unit","Organization Name"}; f
我在填充 javafx tableview 时遇到问题。 我目前正在开发基于 GUI 的事件管理工具(适用于大学),但我一直在尝试填充 Tableview 列表,该列表应该位于边框 Pane 布局的中
当我在 JavaFX 中生成表格时,列太大,我想在它出现在我的应用程序上时调整它们的大小以减少它们。我读了 stackOverflow 上的那些文章,这些文章很有用,但对我没有帮助:javafx co
我有一个账单表,我想在其中列出账单上的所有产品。我保存了ProductInBill ArrayList 内的对象在账单上。 当我创建TableView时我的常用方法是创建 JavaFX 字段。在 Co
我正在尝试使用 javaFX Scene builder 获取可编辑表的值,但无法获取更新的值。 我的表有 2 列:名称列和值列。每当用户更改 value 列的值时,我想使用react。 但是当我打印
我正在使用 JavaFX 制作表格。每行都有文字。一行有一个图形,因为该单元格的文本有多种颜色。 该代码仅在特定条件为真时才适用(该部分有效): departTimeCol.setCellFactor
我有一个包含三列的表,我想确保列的总宽度等于表的宽度,因此我使用 CONSTRAINED_RESIZE_POLICY。 我希望列以我指定的宽度开始,但用户可以修改。 如果我这样做: albumTabl
我正在制作一个使用表格 View 的程序。一切都很顺利,除了由于某种原因我无法将整数值填充到表中。下面是我在主程序中的代码,当我运行程序时,字符串和 double 会填充,但整数不会。在我的 Prod
我正在为我的 TableColumns 创建一个自定义标题,它是列的标签加上一个允许用户执行搜索的 TextField。我正在像这样设置列标题: getColumns().addListener(ne
我在调整包含环绕 TableCell 项目的文本项目的 TableView 大小时遇到问题。调整大小时,隐藏值会调整大小,但可见项不会重新计算文本换行。 红色框中的推文在调整大小时被隐藏,并按预期
要点 在 JavaFX TableColumn 中,右侧有一个排序箭头。 如何设置此箭头的对齐方式? 我的用例 我问是因为我正在尝试申请 Material Design到 JavaFX 并且箭头需要在
在 OpenJFX 11.0.2 & 12.0.1 SDK (Windows 10, x64) 中复制,不能在 JavaFX 8 中复制 右键单击表列,然后尝试调整列的大小。不会显示调整大小光标,并且
这是我的问题: 为 TableColumn 的默认排序设置自定义排序算法。 背景:作为示例列,我想使用将 IPv4 地址表示为 String 的列。因此默认排序是字典顺序(1.1.1.1、1.1.1.
有没有办法阻止用户调整TableView中的任何或至少所有JavaFX TableColumn的大小,同时仍然允许调整大小策略起作用? 存在 TableColumn::setResizing,但在阻止
我正在替换表列的 javafx 上下文菜单。上下文菜单将使用户能够访问 excel,例如表格 View 的过滤。一切正常,但我现在不想在列标题上的任何鼠标单击事件上打开上下文菜单。不仅仅是标准的右键单
以下场景:下表/列中有一些行具有长字符串值。我想出了如何通过手动调用“setCellFactory”并将“text.wrappingWidthProperty()”绑定(bind)到列的宽度来解决包装
我有追随者 http://code.makery.ch/library/javafx-8-tutorial/part2/并且在 TableColumn 中有一个使用 lambdas 的代码设置值: f
有人可以解释我的代码有什么问题吗? 我想创建一个简单的 swt 表。 Eclipse 注意到 TableColumn 是未定义的: TableColumn column = new Table
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; setAutoResizeMode(JTable.AUTO_RESIZE_OFF)
我正在 Gluon Scene Builder 中构建一个 TableView。我想为每列中的单元格设置不同的背景颜色。我能否仅通过 FXML 文件和 CSS 来完成此操作? 使用 CSS 样式类 .
我是一名优秀的程序员,十分优秀!