具有自定义ListCell的javafx ListView中的鬼项
我尝试使用自定义ListCell在ListView中查看自定义对象。为了说明这个问题,我选择了一个例子java.util.File
。同样出于演示目的,我在渲染时直接禁用了ListCell。这些项目是由线程模拟的外部过程添加的。一切看起来都很不错,直到我为禁用的ListCell应用CSS着色为止。现在看来,有些虚幻项与创建它们的ListCell一起被禁用。
我该如何解决?
App.java
public class App extends Application{
@Override
public void start( Stage primaryStage )
{
final ListView<File> listView = new ListView<>();
listView.setCellFactory( column -> {
return new ListCell<File>()
{
protected void updateItem( File item, boolean empty )
{
super.updateItem( item, empty );
if( item == null || empty )
{
setGraphic( null );
return;
}
setDisable( true );
setGraphic( new TextField( item.getName() ) );
}
};
});
new Thread( () -> {
for( int i=0 ; i<10 ; ++i )
{
try
{
Thread.sleep( 1000 );
}
catch( Exception e )
{
e.printStackTrace();
}
final int n = i;
Platform.runLater( () -> {
listView.getItems().add( new File( Character.toString( (char)( (int) 'a' + n ) ) ) );
});
}
}).start();
Scene scene = new Scene( listView );
scene.getStylesheets().add( "app.css" );
primaryStage.setScene( scene );
primaryStage.show();
}
@Override
public void stop() throws Exception
{
super.stop();
}
public static void main( String[] args ) throws Exception
{
launch( args );
}
}
app.css
.list-cell:disabled { -fx-background-color: #ddd;
}
回答:
您永远不会将disable
属性设置回false
。您需要对空单元格执行此操作。可能会发生以下情况Cell
:
- 一项添加到,
Cell
并且该单元格被禁用 - 该项目已从中删除
Cell
,Cell
成为空,但仍处于禁用状态。
通常,当a Cell
变为空时,Cell
应撤消对添加项目时对a 所做的任何更改。
此外,TextField
每次将新项目分配给时,您都应避免重新创建Cell
。
listView.setCellFactory(column -> { return new ListCell<File>() {
private final TextField textField = new TextField();
protected void updateItem(File item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setDisable(false);
setGraphic(null);
} else {
setDisable(true);
textField.setText(item.getName());
setGraphic(textField);
}
}
};
});
以上是 具有自定义ListCell的javafx ListView中的鬼项 的全部内容, 来源链接: utcz.com/qa/418926.html