2016-09-06 1 views
1

Я хотел бы сделать в JavaFX получение TableView из базы данных, но у меня есть много записей, которые нужно загрузить небольшими порциями (например, 50 позиций), и что он получает оставшиеся понемногу, когда я прокручиваю колесо прокрутки. Какие-нибудь советы? или где я могу найти хороший пример?Отображение данных после использования прокрутки мыши

+0

Вы можете попытаться проверить, находится ли полоса прокрутки внизу, если это правда, вам просто нужно добавить больше элементов в «TableView» и повторить процесс, пока у вас не останется никаких элементов. – aleb2000

+0

Я нашел [этот пример] (http://www.superglobals.net/javafx-listview-lazy-loading/). Он использует 'ListView', но процесс тот же. – aleb2000

+0

ОК, спасибо. Вы можете добавить в ответ – Bartek

ответ

1

В качестве примера я буду использовать класс Person, представляющий элемент в таблице.

public class Person { 

    private StringProperty firstName = new SimpleStringProperty(this, "firstName"); 

    private StringProperty lastName = new SimpleStringProperty(this, "lastName"); 

    public Person(String firstName, String lastName) { 
     setFirsName(firstName); 
     setLastName(lastName); 
    } 

    public void setFirsName(String firstName) { 
     this.firstName.set(firstName); 
    } 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public void setLastName(String lastName) { 
     this.lastName.set(lastName); 
    } 

    public String getLastName() { 
     return lastName.get(); 
    } 

    public StringProperty firstNameProperty() { 
     return firstName; 
    } 

    public StringProperty lastNameProperty() { 
     return lastName; 
    } 

} 

Здесь главный класс:

public class TableViewOnScroll extends Application { 

    private ObservableList<Person> peopleToAdd; 

    private int start = 0; 
    private int step = 50; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

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

     ObservableList<Person> displayedPeople = getInitialPeople(); 
     peopleToAdd = getPeopleToAdd(); 

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

     tableView.getColumns().setAll(firstNameCol, lastNameCol); 
     tableView.setItems(displayedPeople); 

     primaryStage.setScene(new Scene(tableView, 600, 400)); 
     primaryStage.show(); 

     // Be sure to put the listener after the stage is shown or the application will throw a NullPointerException 
     ScrollBar tableViewScrollBar = getTableViewScrollBar(tableView); 
     tableViewScrollBar.valueProperty().addListener(new ChangeListener<Number>() { 
      @Override 
      public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
       double position = newValue.doubleValue(); 
       ScrollBar scrollbar = getTableViewScrollBar(tableView); 
       if(position == scrollbar.getMax()) { 
        if(step <= peopleToAdd.size()) { 
         displayedPeople.addAll(peopleToAdd.subList(start, step)); 
         start = step; 
         step += 50; 
         tableView.scrollTo(start); 
        } 
       } 
      } 
     }); 
    } 

    public ObservableList<Person> getPeopleToAdd() { 
     ObservableList<Person> people = FXCollections.observableArrayList(); 
     for(int i = 0; i < 500; i++) { 
      people.add(new Person("Patty", "Johnson")); 
     } 

     return people; 
    } 

    public ObservableList<Person> getInitialPeople() { 
     ObservableList<Person> people = FXCollections.observableArrayList(); 
     for(int i = 0; i < 50; i++) { 
      people.add(new Person("John", "Smith")); 
     } 

     return people; 
    } 

    private ScrollBar getTableViewScrollBar(TableView<?> listView) { 
     ScrollBar scrollbar = null; 
     for (Node node : listView.lookupAll(".scroll-bar")) { 
      if (node instanceof ScrollBar) { 
       ScrollBar bar = (ScrollBar) node; 
       if (bar.getOrientation().equals(Orientation.VERTICAL)) { 
        scrollbar = bar; 
       } 
      } 
     } 
     return scrollbar; 
    } 

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

Использование getInitialPeople() и getPeopleToAdd() только для заполнения списков с некоторыми случайными данными.

+0

Я смогу проверить позже, но большое спасибо – Bartek

+0

Хорошо, если у вас есть проблемы или вопросы о код, который я опубликовал, я буду рад помочь вам. – aleb2000

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