JavaFX TableView点击分拣机无法正常工作? [英] JavaFX TableView click sorters not working?

查看:128
本文介绍了JavaFX TableView点击分拣机无法正常工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么我的TableColumn.setSortable()在双击它时会在表头上显示排序图形,但它实际上根本没有进行任何排序?我想它自然知道如何对数字进行排序?即使对于具有自然排序行为的类型,我是否必须设置显式比较器?

Why is my TableColumn.setSortable() showing the sort graphic on the table header when I double-click on it, but it is not actually doing any sort at all? I would imagine it naturally knows how to sort Numbers? Do I have to set an explicit comparator even for types that have a natural sort behavior?

public class PenaltyDashboardManager { 

    private final TableView<Penalty> penaltyTable = new TableView<Penalty>();

    /* ... */

    private void initializeTable() { 

        penaltyTable.setItems(Penalty.getPenaltyManager().getPenalties());
        penaltyTable.setEditable(true);

        TableColumn<Penalty,Number> penaltyId = new TableColumn<>("ID");
        penaltyId.setCellValueFactory(c -> c.getValue().getPenaltyIdProperty());
        penaltyId.setEditable(true);
        penaltyId.setSortable(true);    
        /* ... */

        penaltyTable.getColumns.add(penaltyId);
    }

}

UPDATE

很奇怪。我试图创建一个简单的例子来证明排序不起作用。但是这个简单的整数列正好排序:/

Very odd. I tried to create a simple example to demonstate the sorting not working. But this simple column of integers is sorting just fine :/

public final  class TableSortTest extends Application {

    private static final ObservableList<NumericCombo> values = FXCollections.observableList(
            IntStream.range(1, 100).mapToObj(i -> new NumericCombo()).collect(Collectors.toList()));

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Collections.shuffle(values);

        TableView<NumericCombo> tableView = new TableView<>();
        tableView.setItems(values);

        TableColumn<NumericCombo,Number> combo1 = new TableColumn<>("COMBO 1");
        combo1.setCellValueFactory(c -> new ReadOnlyObjectWrapper<>(c.getValue().combo1));

        TableColumn<NumericCombo,Number> combo2 = new TableColumn<>("COMBO 2");
        combo2.setCellValueFactory(c -> c.getValue().combo2);

        TableColumn<NumericCombo,Number> combo3 = new TableColumn<>("COMBO 3");
        combo3.setCellValueFactory(c -> c.getValue().combo3);

        tableView.getColumns().addAll(combo1,combo2,combo3);

        Group root = new Group(tableView);

        Scene scene = new Scene(root);

        primaryStage.setScene(scene);   

        primaryStage.show();

    }

    private static final class NumericCombo { 
        private static final Random rand = new Random();

        private final int combo1;
        private final IntegerProperty combo2;
        private final IntegerProperty combo3;

        private NumericCombo() {
            combo1 = rand.nextInt((10000 - 0) + 1);
            combo2 = new SimpleIntegerProperty(rand.nextInt((10000 - 0) + 1));
            combo3 = new SimpleIntegerProperty(rand.nextInt((10000 - 0) + 1));
        }
    }
}


推荐答案

我发现了这个问题!我使用自己的ObservableList实现,名为ObservableImmutableList。它围绕Guava ImmutableList包装ObservableList接口。由于ImmutableList不可修改,因此无法对其进行排序......即使在TableView中也是如此。

I found the issue! I was using my own implementation of ObservableList, called ObservableImmutableList. It wraps the ObservableList interface around a Guava ImmutableList. Since the ImmutableList is not modifiable, it cannot be sorted... even in a TableView.

这转换为另一个我正在努力解决的问题。如何对 ObservableImmutableList 进行排序? 所以我发布了另一个问题

This transitions to another issue I'm struggling to figure out. How do I sort my ObservableImmutableList? So I posted another question.

这篇关于JavaFX TableView点击分拣机无法正常工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆