JavaFX:默认情况下,按特定列对TableView进行排序



我有一个TableView,dataTable,它包含五列。我想根据类型为Integer的TableColumn scoreColumn对行进行排序。用户可以通过单击scoreColumn标题的箭头来完成此操作,但我希望默认情况下按降序对数据进行排序。

表的记录都是同时加载的,不可更新,所以我不必担心顺序会改变,所以排序只需要执行一次。

下面是用数据初始化dataTable的方法,以及TableView和TableColumn声明:

...
@FXML
private TableView<Data> dataTable;
@FXML
private TableColumn<Data, TextFlow> foundPeptideColumn;
@FXML
private TableColumn<Data, String> targetPeptideColumn;
@FXML
private TableColumn<Data, Integer> scoreColumn;
@FXML
private TableColumn<Data, Integer> rowColumn;
@FXML
private TableColumn<Data, Integer> peptideNumColumn;
...
@FXML
private void initialize()
{
// Initialize the data table with the five columns.
foundPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().foundPeptideProperty());
targetPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().peptideProperty());
scoreColumn.setCellValueFactory(cellData -> cellData.getValue().scoreProperty().asObject());
rowColumn.setCellValueFactory(cellData -> cellData.getValue().rowProperty().asObject());
peptideNumColumn.setCellValueFactory(cellData -> cellData.getValue().peptideNumProperty().asObject());
}
...

这是具有TableView:的FXML文件

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="700.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.address.view.AppOverviewController">
<children>
<TableView fx:id="dataTable" layoutX="556.0" layoutY="192.0" prefHeight="700.0" prefWidth="1000.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="50.0">
<columns>
<TableColumn fx:id="foundPeptideColumn" maxWidth="-1.0" minWidth="275.0" prefWidth="275.0" text="Found Peptide" />
<TableColumn fx:id="targetPeptideColumn" maxWidth="-1.0" minWidth="275.0" prefWidth="275.0" text="Target Peptide" />
<TableColumn fx:id="scoreColumn" maxWidth="-1.0" minWidth="150.0" prefWidth="150.0" sortType="DESCENDING" text="Score" />
<TableColumn fx:id="rowColumn" maxWidth="-1.0" minWidth="150.0" prefWidth="150.0" text="Row" />
<TableColumn fx:id="peptideNumColumn" maxWidth="-1.0" minWidth="150.0" prefWidth="150.0" text="Peptide #" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
<TextField fx:id="peptideField" layoutX="113.0" layoutY="14.0" />
<Label layoutX="14.0" layoutY="19.0" text="Enter peptide:" />
<Button layoutX="294.0" layoutY="14.0" mnemonicParsing="false" onAction="#handleSearch" text="Search" />
<Button layoutX="370.0" layoutY="14.0" mnemonicParsing="false" onAction="#handleClearTable" text="Clear Table" />
</children>
</AnchorPane>

我尝试过的东西:

@FXML
private void initialize()
{
scoreColumn.setSortType(TableColumn.SortType.DESCENDING);
dataTable.getSortOrder().add(scoreColumn);
// Initialize the data table with the five columns.
foundPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().foundPeptideProperty());
targetPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().peptideProperty());
scoreColumn.setCellValueFactory(cellData -> cellData.getValue().scoreProperty().asObject());
rowColumn.setCellValueFactory(cellData -> cellData.getValue().rowProperty().asObject());
peptideNumColumn.setCellValueFactory(cellData -> cellData.getValue().peptideNumProperty().asObject());
dataTable.sort();
}

(根据这个问题的答案:按特定列Javafx对TableView进行排序(

@FXML
private void initialize()
{
scoreColumn.setSortType(TableColumn.SortType.DESCENDING);;
// Initialize the data table with the five columns.
foundPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().foundPeptideProperty());
targetPeptideColumn.setCellValueFactory(cellData -> cellData.getValue().peptideProperty());
scoreColumn.setCellValueFactory(cellData -> cellData.getValue().scoreProperty().asObject());
rowColumn.setCellValueFactory(cellData -> cellData.getValue().rowProperty().asObject());
peptideNumColumn.setCellValueFactory(cellData -> cellData.getValue().peptideNumProperty().asObject());
dataTable.getColumns().addAll(scoreColumn);
dataTable.getSortOrder().add(scoreColumn);
dataTable.sort();
}

(基于这个问题的答案:JavaFX:TableView:默认排序的列的箭头(

我还尝试了一些类似于上面例子的其他事情(主要是使用上面尝试的修复的位置/顺序/组合(,但都无济于事。

在FXML或SceneBuilder中,我还有什么可以尝试的吗?

如果有帮助的话,我可以用我的应用程序的图片更新我的帖子,或者为我的控制器添加额外的代码。

是否使用SortedList作为表项的基础?https://openjfx.io/javadoc/11/javafx.base/javafx/collections/transformation/SortedList.html

参见";排序";位于的部分https://openjfx.io/javadoc/11/javafx.controls/javafx/scene/control/TableView.html

(基于此问题的答案:JavaFX:TableView:Arrow for默认排序的列(

我遇到了同样的问题,我使用了链接的答案。

在将数据填充到表中之后,必须插入这部分代码。

dataTable.getColumns().addAll(scoreColumn);
dataTable.getSortOrder().add(scoreColumn);
dataTable.sort();

它对我有效。

相关内容

  • 没有找到相关文章

最新更新