當通過單擊列標題對TableView進行排序時,複選框的行爲變得意外。如果你檢查其中一個,另一個似乎被綁定,並且被選中。TableView排序時出現CheckBoxTableCell錯誤
在對TableView進行排序之前,一切都按預期工作,但是一旦排序被觸發,行爲就會出現意外。
我使用CheckBoxTableCell
,在Windows 8 64bit上運行JDK 1.8.0-ea-b106
64位。
這裏是一個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);
}
}
}
如何重現bug:
- 點擊一次「名」列的標題進行排序表
- 請嘗試選擇「邀請」列中的第一個複選框
- 嘗試選中「已邀請」列中的第三個複選框
正如預期的那樣,該錯誤也出現在Ensemble(JavaFX Samples附帶的應用程序)中。
任何想法如何解決這個問題?
將文件上的bug報告給jira ... – assylias
將一個錯誤歸檔爲一個簡單的過程..從未嘗試過,因爲這是我第一次發現一個bug .. [https: //javafx-jira.kenai.com/browse/RT-33108) 我提交之後,我記得要搜索它,並且[在它之前找到它](https://javafx-jira.kenai.com/browse/RT-32208)在不同的操作系統和不同的用例上。 –
如有必要,他們會將其標記爲重複。 – assylias