2013-10-08 83 views
7

我有一個簡單的java fx應用程序,它有一個表視圖。表視圖顯示按特定順序排序的一些數據。有沒有辦法顯示箭頭(默認情況下)表示數據已按照該順序排序?JavaFX:TableView:默認排序列的箭頭

我的代碼如下:

import java.util.Collections; 

import javafx.application.Application; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 

public class TableViewSample extends Application 
{ 

private TableView<Person>   tableView = new TableView<Person>(); 
private final ObservableList<Person> data  = FXCollections.observableArrayList(new Person(
                "Allan", "Smith", "[email protected]", 
                22), new Person("Zombie", "Jack", 
                "[email protected]", 23), new Person(
                "Michael", "Rock", "[email protected]", 
                24), new Person("Best", "Jones", 
                "[email protected]", 11), new Person(
                "Michael", "Brown", 
                "[email protected]", 14)); 

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

@Override 
public void start(Stage stage) 
{ 
    Scene scene = new Scene(new Group()); 
    stage.setTitle("Table View Sample"); 
    stage.setWidth(650); 
    stage.setHeight(500); 

    final Label label = new Label("Roster"); 
    label.setFont(new Font("Arial", 10)); 

    tableView.setEditable(true); 

    TableColumn firstNameCol = new TableColumn("First Name"); 
    firstNameCol.setMinWidth(100); 
    firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); 


    TableColumn lastNameCol = new TableColumn("Last Name"); 
    lastNameCol.setMinWidth(100); 
    lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); 

    TableColumn emailCol = new TableColumn("Email"); 
    emailCol.setMinWidth(200); 
    emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email")); 

    TableColumn ageCol = new TableColumn("Age"); 
    ageCol.setMinWidth(200); 
    ageCol.setCellValueFactory(new PropertyValueFactory<Person, Integer>("age")); 

    Collections.sort(data); 

    tableView.setItems(data); 
    tableView.getColumns().addAll(firstNameCol, lastNameCol, emailCol, ageCol); 


    final VBox vbox = new VBox(); 
    vbox.setSpacing(5); 
    vbox.getChildren().addAll(label, tableView); 

    ((Group) scene.getRoot()).getChildren().addAll(vbox); 

    stage.setScene(scene); 
    stage.show(); 
} 
public static class Person implements Comparable<Person> 
{ 

    private final SimpleStringProperty firstName; 
    private final SimpleStringProperty lastName; 
    private final SimpleStringProperty email; 
    private final SimpleIntegerProperty age; 


    private Person(String fName, String lName, String email, int age) 
    { 
     this.firstName = new SimpleStringProperty(fName); 
     this.lastName = new SimpleStringProperty(lName); 
     this.email = new SimpleStringProperty(email); 
     this.age = new SimpleIntegerProperty(age); 
    } 

    public SimpleIntegerProperty getAge() 
    { 
     return age; 
    } 

    public void setAge(int passedAge) 
    { 
     age.set(passedAge); 
    } 

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

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

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

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

    public String getEmail() 
    { 
     return email.get(); 
    } 

    public void setEmail(String fName) 
    { 
     email.set(fName); 
    } 

    public int compareTo(Person o) 
    { 
     return firstName.get().compareTo(o.getFirstName()); 
    } 
} 
} 

回答

24

嘗試

... 
firstNameCol.setSortType(TableColumn.SortType.ASCENDING); 
... 
tableView.setItems(data); 
tableView.getColumns().addAll(firstNameCol, lastNameCol, emailCol, ageCol); 
tableView.getSortOrder().add(firstNameCol); 
... 

另請參見上的討論:Javafx: Re-sorting a column in a TableView