2017-02-09 14 views
0

私はstackoverflow-17693136に関連する何かをしようとしています。 「ファーストネーム」テーブルは固定列として機能します。私は両方のテーブルで単一のSortedListを使用しており、私はソートされたデータを右側のテーブルにバインドしています。SortedListを使用して2つのテーブルを並べ替える

したがって、右テーブルのいずれかの列がソートされると、ファーストネームテーブルのデータがソートされます。しかし、私はまた、最初の名前のテーブルのヘッダーをクリックして右のテーブルの列を並べ替えることができるようにしたいと思います。私は現在、両方のテーブルのコンパレータをソートされたデータにバインドする良い方法を見つけることができません。 2のすぐ下のコメントアウトされたコード。ソートされたリストをバインドします。あなたができることを望むものをTableSort.javaコードで見ることができます。私は現在、ソート可能でないようにfirstNameColumnを設定しています(45行目)。

このコードは、Marko Jakobの例に似ています。

TableSort2.java

package tablesort2; 

import javafx.application.Application; 
import static javafx.application.Application.launch; 
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.layout.HBox; 
import javafx.stage.Stage; 

public class TableSort2 extends Application 
{ 
    private TableView<Person> personTable; 
    private TableView<Person> firstNameTable; 
    private TableColumn<Person, String> firstNameColumn;  // In firstNameTable 
    private TableColumn<Person, String> lastNameColumn;  // In personTable 
    private TableColumn<Person, Number> idValueColumn;  // In personTable 

    private ObservableList<Person> masterData = FXCollections.observableArrayList(); 

    @Override 
    public void start(Stage primaryStage) 
    { 
    // Just add some sample data in the initialization 
    masterData.add(new Person("Hans", "Muster",)); 
    masterData.add(new Person("Ruth", "Mueller", 2625)); 
    masterData.add(new Person("Heinz", "Kurz", 1234)); 
    masterData.add(new Person("Cornelia", "Meier", 9999)); 
    masterData.add(new Person("Werner", "Meyer", 5623)); 
    masterData.add(new Person("Lydia", "Kunz", 7834)); 
    masterData.add(new Person("Anna", "Best", 2942)); 
    masterData.add(new Person("Stefan", "Meier", 9423)); 
    masterData.add(new Person("Martin", "Mueller", 9122)); 

    // 0. Initialize the columns 
    firstNameColumn = new TableColumn("First Name"); 
    firstNameColumn.setSortable(false); 

    lastNameColumn = new TableColumn("Last Name"); 
    idValueColumn = new TableColumn("Id Number"); 

    firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
    lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty()); 
    idValueColumn.setCellValueFactory(cellData -> cellData.getValue().idValueProperty()); 

    idValueColumn.setComparator((Number o1, Number o2) -> 
    { 
     return (o1.intValue() < o2.intValue() ? -1 : o1.intValue() == o2.intValue() ? 0 : 1); 
    }); 

    firstNameTable = new TableView<>(); 
    personTable = new TableView<>(); 

    // 1. Wrap the ObservableList in a SortedList. 
    SortedList<Person> sortedData = new SortedList<>(masterData); 

    // 2. Bind the SortedList comparator to the TableView(s) comparator. 
    //sortedData.comparatorProperty().bind(firstNameTable.comparatorProperty()); 
    sortedData.comparatorProperty().bind(personTable.comparatorProperty()); 


    // 3. Add sorted data to the tables. 
    firstNameTable.setItems(sortedData); 
    personTable.setItems(sortedData); 

    firstNameTable.getColumns().add(firstNameColumn); 
    personTable.getColumns().addAll(lastNameColumn, idValueColumn); 

    HBox tableBox = new HBox(5); 
    tableBox.getChildren().addAll(firstNameTable, personTable); 

    Scene scene = new Scene(tableBox); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
    launch(args); 
    } 
} 

Person.java

package tablesort2; 

import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

/** 
* 
* @author dale 
*/ 
public class Person 
{ 
    private final StringProperty firstName; 
    private final StringProperty lastName; 
    private final IntegerProperty idValue; 

    public Person(String firstName, String lastName, Integer id) 
    { 
    this.firstName = new SimpleStringProperty(firstName); 
    this.lastName = new SimpleStringProperty(lastName); 
    this.idValue = new SimpleIntegerProperty(id); 
    } 

    public String getFirstName() 
    { 
    return firstName.get(); 
    } 

    public void setFirstName(String firstName) 
    { 
    this.firstName.set(firstName); 
    } 

    public StringProperty firstNameProperty() 
    { 
    return firstName; 
    } 

    public String getLastName() 
    { 
    return lastName.get(); 
    } 

    public void setLastName(String lastName) 
    { 
    this.lastName.set(lastName); 
    } 

    public StringProperty lastNameProperty() 
    { 
    return lastName; 
    } 

    public Integer getIdValue() 
    { 
    return idValue.get(); 
    } 

    public void setIdValue(Integer id) 
    { 
    this.idValue.set(id); 
    } 

    public IntegerProperty idValueProperty() 
    { 
    return idValue; 
    } 
} 

答えて

0

私は(James_Dからの回答で)、stackoverflow-25144215で動作する何かを発見したと信じています。私は、各列のラベルを使用し、ラベルと共にsetGraphicを使用することができます。これにより、各列にイベントフィルタを追加することができます。 MOUSE_PRESSEDイベントが検出された場合、sortedData.comparatorProperty()はその列が存在するテーブルにバインドされます。これは明らかに実際の並べ替えの前に発生します。これは、更新されたTableSort2.java(下記)に示されています。

これは、テーブル間の複数列のソートでは機能しませんが、このケースでは例外は発生しません。 (これは、ラベルのサイズを考慮して列の幅を手動で調整する必要があることもわかります)。

package tablesort2; 

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.collections.transformation.SortedList; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class TableSort2 extends Application 
{ 
    private TableView<Person> personTable; 
    private TableView<Person> firstNameTable; 
    private TableColumn<Person, String> firstNameColumn;  // In firstNameTable 
    private Label firstNameLabel;     

    private TableColumn<Person, String> lastNameColumn;  // In personTable 
    private Label lastNameLabel; 

    private TableColumn<Person, Number> idValueColumn;  // In personTable 
    private Label idValueLabel; 

    private ObservableList<Person> masterData = FXCollections.observableArrayList(); 

    @Override 
    public void start(Stage primaryStage) 
    { 
    // Just add some sample data in the initialization 
    masterData.add(new Person("Hans", "Muster",)); 
    masterData.add(new Person("Ruth", "Mueller", 2625)); 
    masterData.add(new Person("Heinz", "Kurz", 1234)); 
    masterData.add(new Person("Cornelia", "Meier", 9999)); 
    masterData.add(new Person("Werner", "Meyer", 5623)); 
    masterData.add(new Person("Lydia", "Kunz", 7834)); 
    masterData.add(new Person("Anna", "Best", 2942)); 
    masterData.add(new Person("Stefan", "Meier", 9423)); 
    masterData.add(new Person("Martin", "Mueller", 9122)); 

    // 0. Initialize the columns 
    firstNameColumn = new TableColumn(); 
    firstNameLabel = new Label("First Name"); 
    firstNameColumn.setGraphic(firstNameLabel); 
    //firstNameColumn.setSortable(false); 

    lastNameColumn = new TableColumn(); 
    lastNameLabel = new Label("Last Name"); 
    lastNameColumn.setGraphic(lastNameLabel); 

    idValueColumn = new TableColumn(); 
    idValueLabel = new Label("Id Number"); 
    idValueColumn.setGraphic(idValueLabel); 

    firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
    lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty()); 
    idValueColumn.setCellValueFactory(cellData -> cellData.getValue().idValueProperty()); 

    idValueColumn.setComparator((Number o1, Number o2) -> 
    { 
     return (o1.intValue() < o2.intValue() ? -1 : o1.intValue() == o2.intValue() ? 0 : 1); 
    }); 

    firstNameTable = new TableView<>(); 
    personTable = new TableView<>(); 

    // 1. Wrap the ObservableList in a SortedList. 
    SortedList<Person> sortedData = new SortedList<>(masterData); 

    // 2. Bind the SortedList comparator (initally) to the personTable comparator. 
    //sortedData.comparatorProperty().bind(firstNameTable.comparatorProperty()); 
    sortedData.comparatorProperty().bind(personTable.comparatorProperty()); 

    // 2a. Create listenters for each column header label - to update the comparator property 
    firstNameLabel.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler() 
    { 
     @Override 
     public void handle(Event event) 
     { 
     sortedData.comparatorProperty().bind(firstNameTable.comparatorProperty()); 
     } 
    }); 

    lastNameLabel.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler() 
    { 
     @Override 
     public void handle(Event event) 
     { 
     sortedData.comparatorProperty().bind(personTable.comparatorProperty()); 
     } 
    }); 

    idValueLabel.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler() 
    { 
     @Override 
     public void handle(Event event) 
     { 
     sortedData.comparatorProperty().bind(personTable.comparatorProperty()); 
     } 
    }); 

    // 3. Add sorted data to the table. 
    firstNameTable.setItems(sortedData); 
    personTable.setItems(sortedData); 

    firstNameTable.getColumns().add(firstNameColumn); 
    personTable.getColumns().addAll(lastNameColumn, idValueColumn); 

    HBox tableBox = new HBox(5); 
    tableBox.getChildren().addAll(firstNameTable, personTable); 

    Scene scene = new Scene(tableBox); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
    launch(args); 
    } 
}