2013-12-22 3 views
5

편집 :이 문제는 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 개의 항목이있는 것처럼 보입니다.

시작하기 전에 테이블의 첫 번째 항목을 스크롤하면 올바르게 작동하는 것 같습니다. 아무도 여기서 무슨 일이 벌어지는 지 알아?

+0

이것은 버그처럼 보이며 jira 티켓을 제출해야합니다. – tomsontom

+0

주목할만한 사실입니다. 버그를 신고해야합니다. – assylias

답변

4

이것은 JDK 8 EA 미리보기의 b118과 b120 사이에서 수정 된 버그입니다. b120을 사용하여 예상대로 작동합니다.

관련 문제