当前位置: 首页 > 面试题库 >

具有自定义ListCell的javafx ListView中的鬼项

穆正青
2023-03-14
问题内容

我尝试使用自定义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);
            }
        }
    };
});


 类似资料:
  • 我试图找出如何使用一个与一个在,但没有运气,我已经查了,我能找到的都是不完整的教程和问题。下面是我的FXML 还有我的模特 和我不完整的 还有我的控制器 请不要告诉我找不到。我现在迷路了,我不知道在我的FXML中更新图像视图和标签的正确方法。任何人来帮助或与一个教程的链接,我可以遵循,我将不胜感激。

  • 我正在尝试为JavaFX创建一个非常简单的自定义。运行应用程序时,

  • 问题的核心是,我不能刷新或更改一个场景的节点的内容(这里是TablesMain)从另一个类(这里是NamePriceCell)。 我正在使用主StackPane(TableMainController扩展StackPane)构建和应用程序,其中包含其他节点,其中一些节点是ListView。在一个特定的ListView(比如“readitemslistview”)中,我创建了一个自定义ListCel

  • 好吧,这变得有点复杂,涉及到所有不同的节点。如有可能,请随时提供简化建议。 我试图用自定义对象填充JavaFXListView,并用自定义节点格式化。 我有一个名为Contact的自定义对象,它的定义如下: 下面是我希望ListView中的每个联系人显示为的示例。 此自定义节点(ContactCell)由一个VBox根节点(顶部有一个用于联系人姓名的标签)和一个用于堆叠两部电话的VBox以及一个用

  • 问题内容: 这是我的http服务器: 我需要在myHander内部访问实例t1。 有什么办法吗? 谢谢! 问题答案: 有一种方法可以将属性设置为class: 您必须注意,在所有使用myHandler的地方都将是t1的相同实例

  • 我被一个非常琐碎的问题困扰了两天。我正在创建一个带有Restendpoint的spring boot项目。有两个实体类-Employee和Address,其中一个映射为OneToMany,一个Employee具有地址列表。我创建了一个EmployeeRepository类,该类实现了JpaRepository,用于执行与员工相关的事务。因此,需要通过地址id获取员工,因此根据我的理解,如果我们必须