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

Tableview整数排序bug?

茅炯
2023-03-14

我有一个tableview,其中一列由整数值组成:

    null
public class TableViewTEST extends Application {

private TableView table = new TableView();
final ObservableList<Person> data = FXCollections.observableArrayList(
        new Person("1", "Smith", "jacob.smith@example.com"),
        new Person("9", "Johnson", "isabella.johnson@example.com"),
        new Person("444", "Williams", "ethan.williams@example.com")

);

@Override
public void start(Stage stage) {
    table.getItems().addAll(data);

    Scene scene = new Scene(new Group());

    stage.setTitle(
            "Table View Sample");
    stage.setWidth(
            300);
    stage.setHeight(
            500);

    final Label label = new Label("Address Book");

    label.setFont(
            new Font("Arial", 20));

    TableColumn firstNameCol = new TableColumn("First");
    TableColumn lastNameCol = new TableColumn("Last Name");
    TableColumn emailCol = new TableColumn("Email");

    firstNameCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("firstName")
    );
    lastNameCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("lastName")
    );
    emailCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("email")
    );

    table.getColumns()
            .addAll(firstNameCol, lastNameCol, emailCol);

    final VBox vbox = new VBox();

    vbox.setSpacing(
            5);
    vbox.setPadding(
            new Insets(10, 0, 0, 10));
    vbox.getChildren()
            .addAll(label, table);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);

    stage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

编辑

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

共有1个答案

越健
2023-03-14

您的值是字符串,因此它们是按词典排序的;由于字符'4'在字符'9'之前,所以'444'在'9'之前。

如果将这些字段设置为整数字段,那么它们将按数字排序。这里使用正确类型的tableviewtablecolumn而不是原始类型是很有帮助的。

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class TableViewSortTest extends Application {

private TableView<Person> table = new TableView<>();
final ObservableList<Person> data = FXCollections.observableArrayList(
        new Person(1, "Smith", "jacob.smith@example.com"),
        new Person(9, "Johnson", "isabella.johnson@example.com"),
        new Person(444, "Williams", "ethan.williams@example.com")

);

@Override
public void start(Stage stage) {
    table.getItems().addAll(data);

    Scene scene = new Scene(new Group());

    stage.setTitle(
            "Table View Sample");
    stage.setWidth(
            300);
    stage.setHeight(
            500);

    final Label label = new Label("Address Book");

    label.setFont(
            new Font("Arial", 20));

    TableColumn<Person, Integer> idCol = new TableColumn<>("Id");
    TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
    TableColumn<Person, String> emailCol = new TableColumn<>("Email");

    idCol.setCellValueFactory(
            new PropertyValueFactory<Person, Integer>("id")
    );
    lastNameCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("name")
    );
    emailCol.setCellValueFactory(
            new PropertyValueFactory<Person, String>("email")
    );

    table.getColumns()
            .addAll(idCol, lastNameCol, emailCol);

    final VBox vbox = new VBox();

    vbox.setSpacing(
            5);
    vbox.setPadding(
            new Insets(10, 0, 0, 10));
    vbox.getChildren()
            .addAll(label, table);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);

    stage.show();
}

public static class Person {
    private final IntegerProperty id = new SimpleIntegerProperty(this, "id");
    private final StringProperty name = new SimpleStringProperty(this, "name");
    private final StringProperty email = new SimpleStringProperty(this, "email");

    public Person(int id, String name, String email) {
        this.id.set(id);
        this.name.set(name);
        this.email.set(email);
    }

    public final IntegerProperty idProperty() {
        return this.id;
    }

    public final int getId() {
        return this.idProperty().get();
    }

    public final void setId(final int id) {
        this.idProperty().set(id);
    }

    public final StringProperty nameProperty() {
        return this.name;
    }

    public final java.lang.String getName() {
        return this.nameProperty().get();
    }

    public final void setName(final java.lang.String name) {
        this.nameProperty().set(name);
    }

    public final StringProperty emailProperty() {
        return this.email;
    }

    public final java.lang.String getEmail() {
        return this.emailProperty().get();
    }

    public final void setEmail(final java.lang.String email) {
        this.emailProperty().set(email);
    }


}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

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

  • 问题内容: 我不知道是否为此问题选择了合适的标题(如果没有,请相应地更改它),但是请考虑以下我正在使用的简化表结构: ,,,,,都是不相关的整数/浮筒,它们都代表不同的因素,并可以具有数量级的非常不同的顺序( 范围可从1 - 10,而的范围可以从100 - 1000 )。 我正在尝试选择条件相似的日期。给定一组,,,,,值我需要 返回由下令所有结果 接近 所有值作为一个整体 ,例如,如果,,,,和

  • 简单地说,我有一个tableview,只有一列,我希望对它进行排序,并且每当我向可观察列表中添加新项时,都保持排序。我在网上看了几个例子和类似的问题,但没有什么对我有效。如果我尝试从列表的更改监听器调用tableView.sort(),似乎什么也没有发生。 当我将列添加到表的排序顺序时,事情就会出现问题。在此之后尝试对表进行排序将导致应用程序严重崩溃。唯一的错误是“应用程序启动方法中的异常”。然后

  • 我需要我的使其所有列都可排序,但我不希望通过Shift单击列使其成为多列可排序。有什么办法可以防止这种情况发生吗?

  • 我正在javafx tableview上工作,并创建了一个100,000行的表(三列一int二浮动)。 我有主动分拣功能。要插入新行,首先使用二进制搜索搜索索引,然后使用表插入索引。获取项目。添加(索引、元素); 但是每20毫秒增加一行,gui就有点没有响应。 我添加了table.setSseltionModel(null);它固定了我的GUI,所以它似乎是慢GUI背后的罪魁祸首。 但我还需要选择