具有自定义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

  1. 一项添加到,Cell并且该单元格被禁用
  2. 该项目已从中删除CellCell成为空,但仍处于禁用状态。

通常,当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

回到顶部