2

当通过单击列标题对 TableView 进行排序时,复选框的行为变得意外。如果您选中其中一个,则另一个似乎已绑定到它,并且也被选中。

在对 TableView 进行排序之前,一切都按预期工作,但是一旦触发了排序,就会出现意外行为。

我正在使用CheckBoxTableCell,在 Windows 8 64 位上运行 JDK 1.8.0-ea-b10664 位。

这是一个SSCCE:

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.SortedList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * Author: Anas H. Sulaiman (ahs.pw)
 */
public class CheckBoxTableCellBug extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        ObservableList<Person> persons = FXCollections.observableArrayList();
        persons.add(new Person("Sami", "Haddad", false));
        persons.add(new Person("Ahmed", "Hasan", true));
        persons.add(new Person("Rami", "Kassar", true));
        persons.add(new Person("Nehad", "Hamad", false));
        persons.add(new Person("Jamal", "Raei", true));
        persons.add(new Person("Ameer", "Raji", true));
        persons.add(new Person("Tahseen", "Muhsen", true));

        SortedList<Person> sortedList = new SortedList<>(persons);
        TableView<Person> table = new TableView<>(sortedList);
        sortedList.comparatorProperty().bind(table.comparatorProperty());
        table.setEditable(true);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        TableColumn<Person, String> colFirstName = new TableColumn<>("First Name");
        colFirstName.setCellValueFactory(p -> p.getValue().firstName);
        colFirstName.setCellFactory(TextFieldTableCell.forTableColumn());
        colFirstName.setOnEditCommit(event -> event.getTableView().getItems().get(event.getTablePosition().getRow()).firstName.set(event.getNewValue()));

        TableColumn<Person, String> colLastName = new TableColumn<>("Last Name");
        colLastName.setCellValueFactory(p -> p.getValue().lastName);
        colLastName.setCellFactory(TextFieldTableCell.forTableColumn());
        colLastName.setOnEditCommit(event -> event.getTableView().getItems().get(event.getTablePosition().getRow()).lastName.set(event.getNewValue()));

        TableColumn<Person, Boolean> colInvited = new TableColumn<>("Invited");
        colInvited.setCellValueFactory(p -> p.getValue().invited);
        colInvited.setCellFactory(CheckBoxTableCell.forTableColumn(colInvited));

        table.getColumns().addAll(colFirstName, colLastName, colInvited);

        stage.setScene(new Scene(new StackPane(table)));
        stage.setTitle("CheckBoxTableCell Bug");
        stage.show();
    }

    class Person {
        public StringProperty firstName;
        public StringProperty lastName;
        public BooleanProperty invited;

        public Person() {
            this.firstName = new SimpleStringProperty("");
            this.lastName = new SimpleStringProperty("");
            this.invited = new SimpleBooleanProperty(false);
        }

        public Person(String fname, String lname, boolean invited) {
            this();
            this.firstName.set(fname);
            this.lastName.set(lname);
            this.invited.set(invited);
        }
    }
}

如何重现错误:

  1. 单击一次“名字”列的标题以对表格进行排序
  2. 尝试选中“已邀请”列中的第一个复选框
  3. 尝试选中“已邀请”列中的第三个复选框

正如预期的那样,该错误也存在于 Ensemble(JavaFX 示例随附的应用程序)中。

任何想法如何解决这个问题?

4

1 回答 1

1

该错误已得到修复。我不确定该修复程序是在哪个版本中首次发布的,但我使用的是版本 114,其中修复了该错误。

于 2013-11-12T16:58:30.613 回答