当前位置: 首页 > 知识库问答 >
问题:

对tableview排序时出错

皇甫夕
2023-03-14

简单地说,我有一个tableview,只有一列,我希望对它进行排序,并且每当我向可观察列表中添加新项时,都保持排序。我在网上看了几个例子和类似的问题,但没有什么对我有效。如果我尝试从列表的更改监听器调用tableView.sort(),似乎什么也没有发生。

当我将列添加到表的排序顺序时,事情就会出现问题。在此之后尝试对表进行排序将导致应用程序严重崩溃。唯一的错误是“应用程序启动方法中的异常”。然后,我将sort()调用移动到platform.runlater(),这样可以防止应用程序崩溃。但随后一个新的问题出现了。当调用sort时,我将得到一个数组索引越界错误,这似乎是随机发生的,尽管我认为主要是当新项超出表的视图并需要滚动条时。

在编写这篇文章时,我将更改监听器的排序移到下面添加实际数据的任务中。没有更多的错误。所以我想我的新问题是,为什么当我试图从听众那里做事情时,我会有这么多问题?

public class Temp extends Application{


    private ObservableList<String> libraryList = FXCollections.observableArrayList();


    public void start(Stage stage) {

        Label statusLabel = new Label("stuff goes here");

        TableView<String> table = new TableView<String>(libraryList);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        TableColumn<String, String> col = new TableColumn<String, String>("Stuff");
        col.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue()));
        table.getColumns().add(col);
        table.getSortOrder().add(col);





        libraryList.addListener(new ListChangeListener<String>() {
            public void onChanged(Change change) {


                Platform.runLater(()->{
                    table.sort();
                    statusLabel.setText(libraryList.size()+" entries");
                });

            }

        });





        // dummy stuff
        libraryList.add("foo");
        libraryList.add("bar");



        Button b = new Button("Press Me");
        b.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                FileTask task = new FileTask();
                new Thread(task).start();
            }
        });


        BorderPane mainBody = new BorderPane();

        mainBody.setTop(statusLabel);
        mainBody.setCenter(table);
        mainBody.setBottom(b);
        Scene scene = new Scene(mainBody);
        stage.setScene(scene);
        stage.show();

    }








    class FileTask extends Task<Boolean>{

        public FileTask(){

        }


        protected Boolean call() throws Exception{

            Random rand = new Random();
            for(int i = 0; i < 3; i++) {
                String s = ""+rand.nextInt(Integer.MAX_VALUE);
                libraryList.add(s);
            }

            return true;
        }



    }







    public static void main(String[] args) {
        Application.launch(args);

    }
}

共有1个答案

江渊
2023-03-14

我相信我现在明白问题了。当我将一个项目添加到列表中时,它调用onChanged()。当我对表进行排序时,它也会触发onChanged从而创建一个无限循环。我没有意识到表实际上是通过改变列表本身来对数据进行排序的。

 类似资料:
  • 我有一个表视图,它有一个附加到它的自定义类对象的可观察列表(类类型:SalesInvoiceNetSale)。数据都在表中显示良好。可观察列表中的最后一项是总计行(类类型:SalesInvoiceNetSaleTotal,它扩展了SalesInvoiceNetSale类)。我只是希望如果用户尝试按列对表进行排序,我的表不会对数组中的最后一条记录进行排序。我发现了另一个帖子,几乎是在问如何做同样的事

  • 我有一个tableview,其中一列由整数值组成: null 编辑 好吧,我已经找到了原因,因为我在模型中使用了字符串…所以更新后的问题是,如何在表列上创建一个新的排序功能,以便即使其中有字符串,也可以将其排序为整数?

  • 我的目标是通过拖放对tableview进行排序。我举了一个例子:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_tutorial_intermediate.htm 对于拖放,我通过Scene Builder添加了fxml 制造了控制器 但是在drag Drop,我无法得到我扔下物体的那排位置。我得到的只是手机信息<代码>文本[Text=“

  • 当有空单元格时,我在对列进行排序时有问题。 我为我的列创建了一个新的: 一开始,它似乎很管用: 非常感谢Jai,我修改您的代码只是因为我想将其用于两个不同的列:

  • 我目前有一个表,其中的项可以根据各种列进行排序。我的当前表有空行,允许在不使用任何外部控件(表外按钮)的情况下随时插入新项。 我还没有找到一个解决方案,允许我在忽略空单元格的情况下对给定的列进行排序(即空单元格应该始终保留在表的底部,而所有其他单元格都根据需要进行排序) 对此的任何帮助都将不胜感激。 谢谢。