2015-07-09 2 views
0

У меня есть эта база данных с 15 элементами, которые я загружаю в виде таблицы и устанавливаю количество строк на 10. Он загружает первые 10 (на странице 1) и с использованием разбивки на страницы он загружает последние 5 (на странице 2). Однако, когда я двигаюсь вперед с разбивкой на страницы, он падает. Очевидно, что больше нет строк с элементами для показа, но все же, как я могу это исправить?разбиение на страницы разбивает мое приложение

public class ProductListController implements Initializable { 

@FXML private Pagination page; 


    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     assert tableview !=null : " "; 

     ProductName.setCellValueFactory(cellData -> cellData.getValue().productNameProperty()); 
     ProductPrice.setCellValueFactory(cellData -> cellData.getValue().productPriceProperty()); 
     Stock.setCellValueFactory(cellData -> cellData.getValue().productStockProperty()); 
     Supplier.setCellValueFactory(cellData -> cellData.getValue().productSupplierProperty()); 
     Contact.setCellValueFactory(cellData -> cellData.getValue().productContactProperty()); 
     buildData();   
    } 

     private ObservableList<MyTable> data; 

    private Node createPage(int pageIndex) { 
    int rowsPerPage = 10; 
    int fromIndex = pageIndex * rowsPerPage; 
    int toIndex = Math.min(fromIndex + rowsPerPage, data.size()); 
    tableview.setItems(FXCollections.observableArrayList(data.subList(fromIndex, toIndex))); 

    return (tableview); 
} 

    public void buildData(){ 
    data = FXCollections.observableArrayList(); 

      try{ 
     MyConnection mc = new MyConnection(); 
     ResultSet rs; 
     rs = mc.getConnection(); 


    while (rs.next()) { 
    MyTable mod = new MyTable(); 


    mod.productName.set(rs.getString("NAME")); 
    mod.productPrice.set(rs.getString("SELL_PRICE")); 
    mod.productStock.set(rs.getInt("STOCK")); 
    mod.productSupplier.set(rs.getString("SUPPLIER")); 
    mod.productContact.set(rs.getString("CONTACT")); 

    data.add(mod); 

    page.setPageFactory(this::createPage); 
     } 

     } 

    catch (SQLException | IOException err) { 
    System.out.println(err.getMessage()); 
    } 


    } 
}  
+0

Сбои? Или выбрасывает исключение? Если он выдает исключение, разместите трассировку стека. –

+0

Исключение: Исключение в потоке «Тема приложения JavaFX» java.lang.IllegalArgumentException: fromIndex (20)> toIndex (15) – Ophichius

ответ

0

Необходимо установить количество страниц в разбивке на страницы, чтобы ограничить количество доступных страниц.

Перемещение rowsPerPage в поле (вместо локальной переменной), а затем, после загрузки данных делают

public void initialize() { 
    // ... 
    buildData(); 
    int pageCount = data.size()/rowsPerPage ; 
    if (pageCount * rowsPerPage < data.size()) { 
     pageCount = pageCount + 1 ; 
    } 
    page.setPageCount(pageCount); 
} 
+0

Ага, еще раз спасибо. Так, это всегда так? Если у вас больше страниц, чем нужно, это дает исключение? Потому что пока ничего не видно. – Ophichius

+0

Нет, это дает исключение в этом случае из-за причины, указанной в трассировке стека: вы вызываете 'subList' с' fromIndex' меньше, чем 'toIndex'. Но вы это делаете, потому что ваши вычисления этих значений предполагают, что вы находитесь на действительной странице. Конечно, если у вас ограниченное количество страниц, лучше всего ограничить количество вариантов в разбивке на страницы. –

+0

Итак, из-за pagecount я теперь ограничил количество действительных страниц. Хорошо, спасибо. – Ophichius

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