2013-03-11 968 views
11

在TableView中paginator.?.For这exmple使用...的JavaFX的TableView分页程序

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

回答

10

这里如何是一个分页控制集成的TableView一些示例代码。

代码来自Shakir Quasaroff对Oracle的JavaFX论坛对PaginatedTableView控件的请求的回答。示例代码是纯Java解决方案,而不是原始问题中的Java代码/ FXML混合代码。

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

示例程序输出:

tablepager


此外,第三方LGPL许可TiwulFX library by Panemu提供的TableView(包括分页)高级功能。

+0

这写成控制器类? – user2158598 2013-03-11 23:30:38

+0

不,这个答案中的解决方案不是基于fxml的,它与控制器类无关。 – jewelsea 2013-03-12 00:43:27

+1

我认为提供的示例包含大量不必要的代码,并且做了不必要的工作。为什么为每个页面重新创建tableView?为什么在for循环中创建?看到我的答案为清理版本。没有冒犯的意思。 – 2014-08-21 10:41:52

12

您必须使用Pagination控件并实现页面工厂。工厂要求应显示的每个页面,你可以使用它的参数,该PageIndex的,提供项目的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); 
    ... 
} 

一个完整的可运行的例子可以在这里找到: https://gist.github.com/timbuethe/7becdc4556225e7c5b7b

+0

嗨!感谢您提供使用JavaFX创建页面的方法。但是,在测试代码时我发现了一些小问题(这也适用于@jewelsea)。当数据的大小==到页面中设置的行数时,就会发生混乱(页面内)。在这种情况下,会创建一个附加(空白)页面,并拒绝在任何页面上显示数据。所以,我摒弃了解决这个问题的快速解决方案。希望能帮助到你!请参阅我的帖子以获得代码片段。 :) – cottonman 2015-11-04 09:52:12

+1

它让我感到奇怪的是,createPage返回一个新的BorderPane。这对我来说没有意义,你只是想更新表格内容。 – Joel 2016-08-02 04:12:56

2

在测试此线程上生成的分页代码时,我发现了一个小问题。当数据的大小==到页面中设置的行数时,就会发生混乱(页面内)。在这种情况下,会创建一个附加(空白)页面,并拒绝在任何页面上显示数据。我相信下面的代码段可以解决这个问题(如果其他人遇到与我一样的问题)。这段代码应该在声明分页变量之前出现。

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

希望它有帮助!