2013-03-11 17 views
11

Jak zastosowanie w Tableview paginator.?.For Ten exmple ...JavaFX Tableview paginator

public class SampleController implements Initializable { 

    @FXML private TableView<Student> table; 
    @FXML private TableColumn<Student, Integer> id; 
    @FXML private TableColumn<Student, String> name; 
    @FXML private ObservableList<Student> list = FXCollections.observableArrayList(); 
    // @FXML private Pagination pagination; 
    // 
    private StudentSQL ssql = new StudentSQL(); 
    private Stage stage = new Stage(); 
    private String row; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     id.setCellValueFactory(new PropertyValueFactory<Student, Integer>("id")); 
     name.setCellValueFactory(new PropertyValueFactory<Student, String>("name")); 
     list = ssql.students(); 
     table.setItems(list); 
    } 
} 

Odpowiedz

10

Oto przykładowy kod do integracji Tableview z kontrolą paginacji.

Kod pochodzi z odpowiedzi Shakir Quasaroff na żądanie forum Oracle JavaFX dla kontrolki PaginatedTableView. Przykładowy kod jest czystym rozwiązaniem Java, a nie hybrydą Java Code/FXML, jak w oryginalnym pytaniu.

import java.util.List; 
import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.Pagination; 
import javafx.scene.Node; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class TablePager extends Application { 

    final ObservableList<Person> data = FXCollections.observableArrayList(
      new Person("1", "Joe", "Pesci"), 
      new Person("2", "Audrey", "Hepburn"), 
      new Person("3", "Gregory", "Peck"), 
      new Person("4", "Cary", "Grant"), 
      new Person("5", "De", "Niro"), 
      new Person("6", "Katharine", "Hepburn"), 
      new Person("7", "Jack", "Nicholson"), 
      new Person("8", "Morgan", "Freeman"), 
      new Person("9", "Elizabeth", "Taylor"), 
      new Person("10", "Marcello", "Mastroianni"), 
      new Person("11", "Innokenty", "Smoktunovsky"), 
      new Person("12", "Sophia", "Loren"), 
      new Person("13", "Alexander", "Kalyagin"), 
      new Person("14", "Peter", "OToole"), 
      new Person("15", "Gene", "Wilder"), 
      new Person("16", "Evgeny", "Evstegneev"), 
      new Person("17", "Michael", "Caine"), 
      new Person("18", "Jean-Paul", "Belmondo"), 
      new Person("19", " Julia", "Roberts"), 
      new Person("20", "James", "Stewart"), 
      new Person("21", "Sandra", "Bullock"), 
      new Person("22", "Paul", "Newman"), 
      new Person("23", "Oleg", "Tabakov"), 
      new Person("24", "Mary", "Steenburgen"), 
      new Person("25", "Jackie", "Chan"), 
      new Person("26", "Rodney", "Dangerfield"), 
      new Person("27", "Betty", "White"), 
      new Person("28", "Eddie", "Murphy"), 
      new Person("29", "Amitabh", "Bachchan"), 
      new Person("30", "Nicole", "Kidman"), 
      new Person("31", "Adriano", "Celentano"), 
      new Person("32", "Rhonda", " Fleming's"), 
      new Person("32", "Humphrey", "Bogart")); 
    private Pagination pagination; 

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

    public int itemsPerPage() { 
     return 1; 
    } 

    public int rowsPerPage() { 
     return 5; 
    } 

    public VBox createPage(int pageIndex) { 
     int lastIndex = 0; 
     int displace = data.size() % rowsPerPage(); 
     if (displace > 0) { 
      lastIndex = data.size()/rowsPerPage(); 
     } else { 
      lastIndex = data.size()/rowsPerPage() - 1; 

     } 

     VBox box = new VBox(5); 
     int page = pageIndex * itemsPerPage(); 

     for (int i = page; i < page + itemsPerPage(); i++) { 
      TableView<Person> table = new TableView<Person>(); 
      TableColumn numCol = new TableColumn("ID"); 
      numCol.setCellValueFactory(
        new PropertyValueFactory<Person, String>("num")); 

      numCol.setMinWidth(20); 

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


      firstNameCol.setMinWidth(160); 

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

      lastNameCol.setMinWidth(160); 

      table.getColumns().addAll(numCol, firstNameCol, lastNameCol); 
      if (lastIndex == pageIndex) { 
       table.setItems(FXCollections.observableArrayList(data.subList(pageIndex * rowsPerPage(), pageIndex * rowsPerPage() + displace))); 
      } else { 
       table.setItems(FXCollections.observableArrayList(data.subList(pageIndex * rowsPerPage(), pageIndex * rowsPerPage() + rowsPerPage()))); 
      } 


      box.getChildren().add(table); 
     } 
     return box; 
    } 

    @Override 
    public void start(final Stage stage) throws Exception { 

     pagination = new Pagination((data.size()/rowsPerPage() + 1), 0); 
     // pagination = new Pagination(20 , 0); 
     pagination.setStyle("-fx-border-color:red;"); 
     pagination.setPageFactory(new Callback<Integer, Node>() { 
      @Override 
      public Node call(Integer pageIndex) { 
       if (pageIndex > data.size()/rowsPerPage() + 1) { 
        return null; 
       } else { 
        return createPage(pageIndex); 
       } 
      } 
     }); 

     AnchorPane anchor = new AnchorPane(); 
     AnchorPane.setTopAnchor(pagination, 10.0); 
     AnchorPane.setRightAnchor(pagination, 10.0); 
     AnchorPane.setBottomAnchor(pagination, 10.0); 
     AnchorPane.setLeftAnchor(pagination, 10.0); 
     anchor.getChildren().addAll(pagination); 
     Scene scene = new Scene(anchor, 400, 250); 
     stage.setScene(scene); 
     stage.setTitle("Table pager"); 
     stage.show(); 
    } 

    public static class Person { 

     private final SimpleStringProperty num; 
     private final SimpleStringProperty firstName; 
     private final SimpleStringProperty lastName; 

     private Person(String id, String fName, String lName) { 
      this.firstName = new SimpleStringProperty(fName); 
      this.lastName = new SimpleStringProperty(lName); 
      this.num = new SimpleStringProperty(id); 
     } 

     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 getNum() { 
      return num.get(); 
     } 

     public void setNum(String id) { 
      num.set(id); 
     } 
    } 
} 

próbki wyjście programu:

tablepager


Dodatkowo, osoba trzecia, LGPL licencjonowane TiwulFX library by Panemu zapewnia zaawansowaną funkcjonalność Tableview (łącznie paginacji).

+0

Ten zapis stanie się klasą kontrolera? – user2158598

+0

Nie, rozwiązanie w tej odpowiedzi nie opiera się na fxml, nie jest powiązane z klasą Controller. – jewelsea

+1

Myślę, że podany przykład zawiera dużo niepotrzebnego kodu i niepotrzebnie działa. Dlaczego tabela view odtworzono dla każdej strony? I dlaczego jest stworzony w pętli for? Zobacz moją odpowiedź na wyczyszczoną wersję. Bez urazy. –

12

Należy użyć kontrolki Pagination i zaimplementować fabrykę stron. Fabryka jest wywoływana dla każdej strony, które powinny być wyświetlane i można użyć jej parametr, PageIndex, aby zapewnić podmenu elementy do Tableview:

TableView table = ... 

private Node createPage(int pageIndex) { 

    int fromIndex = pageIndex * rowsPerPage; 
    int toIndex = Math.min(fromIndex + rowsPerPage, data.size()); 
    table.setItems(FXCollections.observableArrayList(data.subList(fromIndex, toIndex))); 

    return new BorderPane(table); 
} 


@Override 
public void start(final Stage stage) throws Exception { 

    Pagination pagination = new Pagination((data.size()/rowsPerPage + 1), 0); 
    pagination.setPageFactory(this::createPage); 
    ... 
} 

Kompletny runnable przykład można znaleźć tutaj: https://gist.github.com/timbuethe/7becdc4556225e7c5b7b

+0

Cześć! Dziękujemy za udostępnienie metody tworzenia stron za pomocą JavaFX. Jednak podczas testowania kodu odkryłem mały problem (dotyczy to również @jewelsea). Gdy rozmiar danych == do liczby wierszy ustawionych na stronie, wystąpi chaos (na stronach). W takim przypadku tworzona jest dodatkowa (pusta) strona, a dane nie będą wyświetlane na żadnej ze stron. Tak więc opracowałem szybkie rozwiązanie, aby przeciwdziałać temu problemowi. Mam nadzieję, że to pomoże! Zapoznaj się z moim postem na temat fragmentu kodu. :) – cottonman

+1

To dziwne, że createPage zwraca nową ramkę BorderPane. To nie ma dla mnie sensu, po prostu chcesz zaktualizować zawartość tabeli. – Joel

2

Odkryłem mały problem podczas testowania kodu stronicowania wyprodukowanego w tym wątku. Gdy rozmiar danych == do liczby wierszy ustawionych na stronie, wystąpi chaos (na stronach). W takim przypadku tworzona jest dodatkowa (pusta) strona, a dane nie będą wyświetlane na żadnej ze stron. Uważam, że poniższy fragment powinien rozwiązać ten problem (jeśli ktoś napotka na ten sam problem co ja). Ten fragment powinien pochodzić przed zadeklarowaniem zmiennej Pagina.

int numOfPages = 1; 
if (data.size() % rowsPerPage == 0) { 
    numOfPages = data.size()/rowsPerPage; 
} else if (data.size() > rowsPerPage) { 
    numOfPages = data.size()/rowsPerPage + 1; 
} 
Pagination pagination = new Pagination((numOfPages), 0); 
pagination.setPageFactory(this::createPage); 

Mam nadzieję, że pomoże!

Powiązane problemy