2013-03-11 3 views
11

Come l'uso in TableView paginator.?.For Questo 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); 
    } 
} 

risposta

10

Ecco alcuni esempi di codice per l'integrazione TableView con un controllo paginazione.

Il codice proviene dalla risposta di Shakir Quasaroff a una richiesta del forum JavaFX Oracle per un controllo PaginatedTableView. Il codice di esempio è una soluzione Java pura, piuttosto che un ibrido Java Code/FXML come nella domanda originale.

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); 
     } 
    } 
} 

Esempio output del programma:

tablepager


Inoltre, il terzo, LGPL licenza TiwulFX library by Panemu fornisce funzionalità avanzate per TableView (compresi impaginazione).

+0

Questa scrittura diventa nella classe controller? – user2158598

+0

No, la soluzione in questa risposta non è basata su fxml, non è correlata a una classe Controller. – jewelsea

+1

Penso che l'esempio fornito contenga un sacco di codice non necessario e funzioni inutilmente. Perché il tavoloView viene ricreato per ogni pagina? E perché è creato in un ciclo for? Vedi la mia risposta per una versione ripulita. Senza offesa. –

12

È necessario utilizzare il controllo Pagination e implementare una pagina di produzione. La fabbrica si chiama per ogni pagina che dovrebbe essere visualizzato ed è possibile utilizzare il suo parametro, il pageIndex, per fornire un elenco secondario di elementi al 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); 
    ... 
} 

Un esempio eseguibile completo può essere trovato qui: https://gist.github.com/timbuethe/7becdc4556225e7c5b7b

+0

Ciao! Grazie per aver fornito il metodo per la creazione di pagine con JavaFX. Tuttavia, ho scoperto un piccolo problema durante la verifica del codice (questo vale anche per @jewelsea). Quando la dimensione dei dati == al numero di righe che si sono impostate in una pagina, si verificherà il caos (all'interno delle pagine). In questo caso, viene creata una pagina aggiuntiva (vuota) e i dati si rifiutano di apparire su una qualsiasi delle pagine. Quindi, ho tirato fuori una soluzione rapida per contrastare questo problema. Spero che sia d'aiuto! Fare riferimento al mio post per lo snippet di codice. :) – cottonman

+1

Mi sembra strano che createPage restituisca un nuovo BorderPane. Non ha senso per me, vuoi semplicemente aggiornare il contenuto della tabella. – Joel

2

Ho scoperto un piccolo problema durante il test del codice di impaginazione prodotto su questo thread. Quando la dimensione dei dati == al numero di righe che si sono impostate in una pagina, si verificherà il caos (all'interno delle pagine). In questo caso, viene creata una pagina aggiuntiva (vuota) e i dati si rifiutano di apparire su una qualsiasi delle pagine. Credo che il seguente frammento dovrebbe risolvere quel problema (se qualcun altro sta incontrando lo stesso problema di me). Questo snippet dovrebbe venire prima di dichiarare la variabile di impaginazione.

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); 

Spero che sia d'aiuto!