2016-04-27 4 views
7

TableView複数選択は、選択したオブジェクトの1つをnullとして返します。これは毎回起こるわけではありませんが、テーブル内で2つの行を選択しようとするとほとんどの場合発生します。 similar to the issue defined in this questionjavafx8 TableView Multiselectionは、選択した項目の1つをnullとして返します。

問題を再現する最もよい方法は、2つの連続する行を選択することです。 FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ProgressBar?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.control.cell.PropertyValueFactory?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.Region?> 
<?import javafx.scene.layout.StackPane?> 




<AnchorPane xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.test.controller.TestController"> 
       <children> 
        <TableView fx:id="personsTable" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="35.0"> 
         <placeholder> 
          <Label text="" /> 
         </placeholder> 
         <columns> 
          <TableColumn text="Name"> 
           <cellValueFactory> 
            <PropertyValueFactory property="name" /> 
           </cellValueFactory> 
          </TableColumn> 
          <TableColumn text="Address"> 
           <cellValueFactory> 
            <PropertyValueFactory property="address" /> 
           </cellValueFactory> 
          </TableColumn> 
          <TableColumn text="Course"> 
           <cellValueFactory> 
            <PropertyValueFactory property="course" /> 
           </cellValueFactory> 
          </TableColumn> 
          <TableColumn text="Country"> 
           <cellValueFactory> 
            <PropertyValueFactory property="country" /> 
           </cellValueFactory> 
          </TableColumn> 
         </columns> 
        </TableView> 
       </children> 
      </AnchorPane> 

コントローラー:

import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.ResourceBundle; 



import com.test.model.Person; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.ContextMenu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.control.TableView; 


public class TestController implements Initializable { 

    @FXML 
    TableView<Person> personsTable = new TableView<Person>(); 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // TODO Auto-generated method stub 
     MenuItem combine = new MenuItem("Select"); 
     combine.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       List<Person> selectedPersons = new ArrayList<Person>(
         personsTable.getSelectionModel().getSelectedItems()); 
       for (Person person : selectedPersons) { 
        System.out.println(" the object is " + person); 
       } 
      } 
     }); 

     ContextMenu contextMenu = new ContextMenu(); 
     contextMenu.getItems().add(combine); 

     personsTable.setContextMenu(contextMenu); 

     personsTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

     personsTable.setItems(getPendingOrders()); 
    } 

    public ObservableList<Person> getPendingOrders() { 
     ObservableList<Person> persons = FXCollections.observableArrayList(); 
     for (int i = 0; i < 100; i++) { 
      Person person = new Person(); 
      person.setName("Name" + i); 
      person.setAddress("Address" + i); 
      person.setCountry("Country" + i); 
      person.setCourse("Course" + i); 
      persons.add(person); 

     } 

     return persons; 
    } 
} 

モデル:

public class Person { 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    public String getCourse() { 
     return course; 
    } 

    public void setCourse(String course) { 
     this.course = course; 
    } 

    private String name; 
    private String address; 
    private String country; 
    private String course; 

} 
+0

helpls願っています:。 personsTable.getSelectionModel()getSelectedItems()はnull「他のnullでない場合は、ここでのaddListener(新InvalidationListener(){..codeは名前を印刷します見つかりました "..}; 「Shift +クリック」を使用して2つの行を選択し、2つ目の行をクリックして簡単に再現することができます。 – DVarga

+1

JavaFX(8u60 +)のバグです。私の答え[ここ](http://stackoverflow.com/a/38207246/4185959)を参照してください。 – Itai

答えて

0

1:デフォルトのセル工場を追加するには、テーブルビュー

2:上書きのいずれかupdateItemまたはupdateIndex

は、それは私がして、コードを少し更新した

+0

オーバーライドされたupdateItemメソッドで何が行われる必要があるかについてのヒントを教えてください。 – user68883

+0

これで問題を解決するのはなぜですか?セルファクトリは、選択モデルではなく、アイテムがレンダリングされる方法にのみ関係します。 – Itai

+0

あなたはそれをより詳しく説明できますか?これがなぜ役立つのかわからない – dinhokz

関連する問題