2013-09-23 25 views
2

當通過單擊列標題對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:

  1. 點擊一次「名」列的標題進行排序表
  2. 請嘗試選擇「邀請」列中的第一個複選框
  3. 嘗試選中「已邀請」列中的第三個複選框

正如預期的那樣,該錯誤也出現在Ensemble(JavaFX Samples附帶的應用程序)中。

任何想法如何解決這個問題?

+0

將文件上的bug報告給jira ... – assylias

+0

將一個錯誤歸檔爲一個簡單的過程..從未嘗試過,因爲這是我第一次發現一個bug .. [https: //javafx-jira.kenai.com/browse/RT-33108) 我提交之後,我記得要搜索它,並且[在它之前找到它](https://javafx-jira.kenai.com/browse/RT-32208)在不同的操作系統和不同的用例上。 –

+0

如有必要,他們會將其標記爲重複。 – assylias

回答

1

The bug已被修復。我不確定修復程序在哪個版本中首次發佈,但是我使用的是版本114,其中修復了該錯誤。

+0

這個bug在1.8.0-b132(64bit)中仍然很明顯,截至2014年4月3日 – 2014-04-03 18:20:31