Tableview整数排序有问题吗?

min*_*sel 2 javafx tableview

我有一个tableview,其中一个列包含Integer值:

  • 1
  • 444 -9

如果我对这个专栏进行排序,我认为444是"最高"数,因此是第一行,但JavaFX认为9更高?

有小费吗?

MVCE:

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);
}

}
Run Code Online (Sandbox Code Playgroud)

编辑

好吧,我发现原因是因为我在模型中使用了String.所以更新的问题是,如何在表列上创建一个新的排序功能,以便它排序为整数,即使它中有字符串?

Jam*_*s_D 8

你的值是Strings,所以按字典顺序排序; 因为字符'4'在字符'9'之前,'444'在'9'之前.

如果您将这些字段设为整数字段,那么它们将按数字排序.这里使用正确键入的TableViews和TableColumns代替原始类型是有帮助的.

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);
}

}
Run Code Online (Sandbox Code Playgroud)