2015-07-31 4 views
0

Я решил основную проблему, на которую я смотрел, установив компаратор на всю таблицу, но то, что я изначально пытался сделать, это найти способ «щелкнуть» заголовок для генерации события сортировки.JavaFX TableColumn: есть ли способ генерировать событие заголовка столбца?

Мне все еще хотелось бы знать, как это сделать, поскольку в настоящее время я не знаю метода сортировки методов сортировки столбцов, а только сама таблица.

ответ

2

Вызов getSortOrder() на TableView: что возвращает список TableColumn с представляющими порядок, по которому сортируются строки:

Пустой список SortOrder означает, что сортировка не применяется на TableView. Если в списке sortOrder имеется один столбец таблицы, то таблица TableView будет сортироваться с использованием свойств sortType и компаратора этой TableColumn (при условии, что TableColumn.sortable истинно). Если список sortOrder содержит несколько экземпляров TableColumn, то таблица TableView сначала сортируется на основе свойств первой таблицы TableColumn. Если два элемента считаются равными, тогда вторая таблица TableColumn используется для определения порядка. Это повторяется до тех пор, пока не будут рассмотрены результаты всех компараторов TableColumn, если необходимо .

Затем просто добавьте, удалите, установите, очистите и т.д. список по мере необходимости.

SSCCE:

import java.util.function.Function; 

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class TableViewProgrammaticSort extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     TableView<Person> table = new TableView<>(); 

     TableColumn<Person, String> firstNameCol = column("First Name", Person::firstNameProperty); 
     TableColumn<Person, String> lastNameCol = column("Last Name", Person::lastNameProperty); 
     TableColumn<Person, String> emailCol = column("Email", Person::emailProperty); 

     table.getColumns().add(firstNameCol); 
     table.getColumns().add(lastNameCol); 
     table.getColumns().add(emailCol); 

     table.getItems().addAll(
      new Person("Jacob", "Smith", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethan", "Williams", "[email protected]"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]") 
     ); 

     ComboBox<TableColumn<Person, ?>> sortCombo = new ComboBox<>(); 
     sortCombo.getItems().add(firstNameCol); 
     sortCombo.getItems().add(lastNameCol); 
     sortCombo.getItems().add(emailCol); 

     sortCombo.setCellFactory(lv -> new ColumnListCell()); 
     sortCombo.valueProperty().addListener((obs, oldColumn, newColumn) -> { 
      table.getSortOrder().clear(); 
      if (newColumn != null) { 
       table.getSortOrder().add(newColumn); 
      } 
     }); 
     sortCombo.setButtonCell(new ColumnListCell()); 

     BorderPane root = new BorderPane(table, sortCombo, null, null, null); 
     BorderPane.setMargin(table, new Insets(10)); 
     BorderPane.setMargin(sortCombo, new Insets(10)); 
     BorderPane.setAlignment(sortCombo, Pos.CENTER); 

     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private static class ColumnListCell extends ListCell<TableColumn<Person, ?>> { 
     @Override 
     public void updateItem(TableColumn<Person, ?> column, boolean empty) { 
      super.updateItem(column, empty); 
      if (empty) { 
       setText(null); 
      } else { 
       setText(column.getText()); 
      } 
     } 
    } 

    private static <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue<T>> property) { 
     TableColumn<S,T> col = new TableColumn<>(title); 
     col.setCellValueFactory(cellData -> property.apply(cellData.getValue())); 
     return col ; 
    } 

    public static class Person { 
     private final StringProperty firstName = new SimpleStringProperty(this, "firstName"); 
     private final StringProperty lastName = new SimpleStringProperty(this, "lastName"); 
     private final StringProperty email = new SimpleStringProperty(this, "email"); 

     public Person(String firstName, String lastName, String email) { 
      this.firstName.set(firstName); 
      this.lastName.set(lastName); 
      this.email.set(email); 
     } 

     public final StringProperty firstNameProperty() { 
      return this.firstName; 
     } 

     public final java.lang.String getFirstName() { 
      return this.firstNameProperty().get(); 
     } 

     public final void setFirstName(final java.lang.String firstName) { 
      this.firstNameProperty().set(firstName); 
     } 

     public final StringProperty lastNameProperty() { 
      return this.lastName; 
     } 

     public final java.lang.String getLastName() { 
      return this.lastNameProperty().get(); 
     } 

     public final void setLastName(final java.lang.String lastName) { 
      this.lastNameProperty().set(lastName); 
     } 

     public final StringProperty emailProperty() { 
      return this.email; 
     } 

     public final java.lang.String getEmail() { 
      return this.emailProperty().get(); 
     } 

     public final void setEmail(final java.lang.String email) { 
      this.emailProperty().set(email); 
     } 

    } 

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

Я думаю, что я пропускаю шаг. Я получаю, что sortOrder - это список TableColumns в порядке сортировки, но как мне сгенерировать сортировку из списка TableColumns? –

+0

Я не понимаю вопроса в этом комментарии. –

+0

В ответе указывается, как получить порядок сортировки таблицы, а не как вызвать сортировку. Как я понимаю. –

 Смежные вопросы

  • Нет связанных вопросов^_^