편집 :이 문제는 filed a bug report입니다. b120이 아닌 b118에 대해이 예제를 실수로 실행 한 것으로 나타났습니다. 이 버그는 b118과 b120 사이에서 언젠가 고쳐졌고 b120을 사용하여 모든 것이 예상대로 작동합니다.이 JavaFX TableView 스크롤 막대가 제대로 업데이트되지 않는 이유는 무엇입니까?
JavaFX 8 (OpenJDK 빌드 120)을 사용하고 있으며 TableView를 잘못 스크롤하는 데 문제가 있습니다. 여기 SSCCE입니다 :
import javafx.application.Application;
import javafx.beans.binding.IntegerBinding;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class TableViewScroll extends Application {
private final ObservableList<Person> personList = FXCollections.observableArrayList();
private final FilteredList<Person> filteredPersonList = new FilteredList<>(personList);
private final StringProperty filterText = new SimpleStringProperty();
private final IntegerProperty count = new SimpleIntegerProperty();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Scene scene = createScene();
initPersonList();
bindCount();
addFilterListener();
primaryStage.setTitle("Table View Scroll");
primaryStage.setScene(scene);
primaryStage.show();
}
private Scene createScene() {
VBox vBox = new VBox();
vBox.setPadding(new Insets(5));
vBox.setSpacing(5);
TableView<Person> resultsTable = new TableView<>();
TableColumn<Person, String> indexColumn = new TableColumn<>("#");
indexColumn.setCellValueFactory(param -> {
// assumes unique list items
int index = resultsTable.getItems().indexOf(param.getValue());
return new ReadOnlyStringWrapper(Integer.toString(index + 1));
});
TableColumn<Person, String> nameColumn = new TableColumn<>("Name");
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
resultsTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
resultsTable.getColumns().setAll(indexColumn, nameColumn);
resultsTable.setItems(filteredPersonList);
TextField filterTextField = new TextField();
filterTextField.textProperty().bindBidirectional(filterText);
Label countLabel = new Label();
countLabel.textProperty().bind(count.asString());
vBox.getChildren().setAll(filterTextField, resultsTable, countLabel);
return new Scene(vBox);
}
private void initPersonList() {
String firstNames = "Adam, Adrian, Alan, Alexander, Andrew, Anthony," +
" Austin, Benjamin, Blake, Boris, Brandon, Brian, Cameron," +
" Carl, Charles, Christian, Christopher, Colin, Connor, Dan," +
" David, Dominic, Dylan, Edward, Eric, Evan, Frank, Gavin," +
" Gordon, Harry, Ian, Isaac, Jack, Jacob, Jake, James, Jason," +
" Joe, John, Jonathan, Joseph, Joshua, Julian, Justin, Keith," +
" Kevin, Leonard, Liam, Lucas, Luke, Matt, Max, Michael," +
" Nathan, Neil, Nicholas, Oliver, Owen, Paul, Peter, Phil," +
" Piers, Richard, Robert, Ryan, Sam, Sean, Sebastian, Simon," +
" Stephen, Steven, Stewart, Thomas, Tim, Trevor, Victor," +
" Warren, William";
String[] firstNameArray = firstNames.split("\\s*,\\s*");
String lastNames = "Abraham, Allan, Alsop, Anderson, Arnold, Avery," +
" Bailey, Baker, Ball, Bell, Berry, Black, Blake, Bond," +
" Bower, Brown, Buckland, Burgess, Butler, Cameron, Campbell," +
" Carr, Chapman, Churchill, Clark, Clarkson, Coleman," +
" Cornish, Davidson, Davies, Dickens, Dowd, Duncan, Dyer," +
" Edmunds, Ellison, Ferguson, Fisher, Forsyth, Fraser," +
" Gibson, Gill, Glover, Graham, Grant, Gray, Greene," +
" Hamilton, Hardacre, Harris, Hart, Hemmings, Henderson," +
" Hill, Hodges, Howard, Hudson, Hughes, Hunter, Ince," +
" Jackson, James, Johnston, Jones, Kelly, Kerr, King, Knox," +
" Lambert, Langdon, Lawrence, Lee, Lewis, Lyman, MacDonald," +
" Mackay, Mackenzie, MacLeod, Manning, Marshall, Martin," +
" Mathis, May, McDonald, McLean, McGrath, Metcalfe, Miller," +
" Mills, Mitchell, Morgan, Morrison, Murray, Nash, Newman," +
" Nolan, North, Ogden, Oliver, Paige, Parr, Parsons," +
" Paterson, Payne, Peake, Peters, Piper, Poole, Powell," +
" Pullman, Quinn, Rampling, Randall, Rees, Reid, Roberts," +
" Robertson, Ross, Russell, Rutherford, Sanderson, Scott," +
" Sharp, Short, Simpson, Skinner, Slater, Smith, Springer," +
" Stewart, Sutherland, Taylor, Terry, Thomson, Tucker," +
" Turner, Underwood, Vance, Vaughan, Walker, Wallace, Walsh," +
" Watson, Welch, White, Wilkins, Wilson, Wright, Young";
String[] lastNameArray = lastNames.split("\\s*,\\s*");
int firstNameLength = firstNameArray.length;
int lastNameLength = lastNameArray.length;
Random firstRandomIndex = new Random();
Random lastRandomIndex = new Random();
// Use a set to ensure all names are unique
Set<String> names = new HashSet<>();
for (int i = 0; i < 2000; i++) {
String first = firstNameArray[firstRandomIndex.nextInt(firstNameLength)];
String last = lastNameArray[lastRandomIndex.nextInt(lastNameLength)];
names.add(first + " " + last);
}
for (String name : names) {
personList.add(new Person(name));
}
}
private void bindCount() {
count.bind(new IntegerBinding() {
{
bind(filteredPersonList);
}
@Override
protected int computeValue() {
return filteredPersonList.size();
}
});
}
private void addFilterListener() {
filterText.addListener((o, old, filter) ->
filteredPersonList.setPredicate(person -> {
String[] terms = filter.split("\\s");
for (String term : terms) {
if (person.getName().toLowerCase().contains(term.toLowerCase())) {
return true;
}
}
return false;
}));
}
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
나는 FilteredList
를 사용하고 있지만, 또한 하나의 필터링되지 않은, ObservableList
에 문제가있다. 위의 예제를 실행하고 테이블을 터치하지 말고 텍스트 필드를 사용하여 테이블 항목을 필터링하십시오. 테이블을 ~ 50 개까지 내려 봅니다. 필터 wil
(WIL)이 꽤 잘 작동한다고 생각합니다.
목록에 ~ 50 개 항목 만 나오면 아래로 스크롤하십시오. 스크롤 막대 (핸들)의 크기가 잘못되었습니다. Here is a screenshot은 내가 의미하는 것을 보여줍니다. 하단의 레이블에는 필터링 된 목록의 항목 수가 표시됩니다. 테이블이 마지막 항목까지 어떻게 스크롤되었지만 스크롤바는 목록에 ~ 2000 개의 항목이있는 것처럼 보입니다.
시작하기 전에 테이블의 첫 번째 항목을 스크롤하면 올바르게 작동하는 것 같습니다. 아무도 여기서 무슨 일이 벌어지는 지 알아?
이것은 버그처럼 보이며 jira 티켓을 제출해야합니다. – tomsontom
주목할만한 사실입니다. 버그를 신고해야합니다. – assylias