2016-08-05 11 views
7

To jest część mojego kodu.JavaFX: textArea.setScrollTop (Double.MAX_VALUE) nie zawsze działa

textArea.setText(someNewText) 
textArea.positionCaret(textArea.getText().length()); 
textArea.setEditable(true); 
textArea.setScrollTop(Double.MAX_VALUE); 

używam textArea.setScrollTop(Double.MAX_VALUE) do przewijania textarea do dołu (roztwór znalazłem w internecie). Działa, ale nie zawsze. Zauważyłem, że nie może działać tylko wtedy, gdy pionowy pasek przewijania nie jest widoczny przed wywołaniem tego kodu i widoczny po wykonaniu kodu. Kiedy pionowy pasek przewijania jest widoczny przed wywołaniem tego kodu, przewijanie do dołu działa zawsze. Jak to naprawić? Może powinienem zrobić pionowy pasek przewijania zawsze widoczny? Jeśli tak, to w jaki sposób - nie znalazłem rozwiązania.

EDIT: To jest przykładowy kod:

public class JavaFxApp1 extends Application{ 

    private TextArea textArea; 

    @Override 
    public void start(Stage stage) throws Exception { 
     Button button=new Button("Press here"); 
     textArea=new TextArea(); 
     VBox vbox = new VBox(button,textArea); 
     button.setOnAction((event)->{ 
      textArea.appendText("###This is a very long string:some text some text some text some text some" 
        + " text some text some text some text some text some text" 
        + " text some text some text some text some text some text" 
        + " text some text some text some text some text some text .\n"); 
      textArea.selectEnd(); 
      textArea.deselect(); 
      textArea.setScrollTop(Double.MAX_VALUE); 
     }); 
     textArea.setEditable(true); 
     textArea.setWrapText(true); 
     textArea.setStyle("-fx-font-size:14px;-fx-focus-color: transparent;-fx-font-family: monospace;"); 
     Scene scene=new Scene(vbox); 
     stage.setTitle("SomeTitle"); 
     stage.setScene(scene); 
     stage.setMinHeight(400); 
     stage.setMinWidth(800); 
     stage.show(); 
    } 
} 

Jest to wynik, kiedy wciśnięty przycisk 4 razy: enter image description here Jak widać nie przewiń do dołu. Po ponownym naciśnięciu przycisku (po raz piąty) uzyskano następujący wynik: enter image description here Teraz, jak widać, przewijano go na sam dół. Próbowałem dodać:

ScrollPane scrollPane = (ScrollPane) textArea.lookup(".scroll-pane"); 
scrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS); 

do przewijania zawsze widoczne - jest to widoczne, ale po 4 razy i tak nie przewiń do dołu.

Jak to naprawić?

+0

To jest błąd, więc otworzyłem raport o błędzie. Zobacz https://bugs.openjdk.java.net/browse/JDK-8189732 –

Odpowiedz

1

jeśli chcesz, aby przewinąć do góry Twój kod będzie tędy

ta.selectHome(); 
ta.deselect(); 

jeśli chcesz przejść do sedna Twój kod będzie tędy

ta.selectEnd(); 
ta.deselect(); 

teraz niech TextArea martwić się o jego widoczne obszary

edycja

może mi się nie dostać swoje wymagania, bo szczerze to po raz pierwszy widziałem tej metody tak, aby dać odpowiedź opartą na hipotezie

Może powinienem zrobić pionowy pasek przewijania zawsze widoczne? Jeśli tak, to w jaki sposób

dobrze ów łatwego TextArea wykorzystuje ScrollPane, gdy widoczny jest zwój ta linia TextArea.getChildrenUnmodifiable().size(); sprawdzi się 1, więc łowić ją podczas tworzenia TextArea

TextArea.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() { 
     @Override 
     public void onChanged(javafx.collections.ListChangeListener. 
      Change<? extends Node> c) { 
      while(c.next()){ 
       if(c.wasAdded()){ 
        for(Node n : TextArea.getChildrenUnmodifiable()){ 
         if(n.getClass().isAssignableFrom(ScrollPane.class)){ 
          //just trying to be cool here ^^ 
          ScrollPane sp = (ScrollPane) n; 
          sp.setVbarPolicy(ScrollBarPolicy.ALWAYS); 
         } 
        } 
       } 
      } 
     } 
    }); 

rzeczywiście można zachować odniesienie do ScrollPane i kiedykolwiek chcesz, aby przewinąć do dołu ScrollPane.setVvalue(1.0); na górę ScrollPane.setVvalue(0.0); itp itd

możesz uzyskać wartość za pomocą ScrollPane.getVvalue().

+0

Dziękuję za pomysły, ale to nie pomogło. Zobacz moją edycję. –

+0

@ JimJim2000 usuwa ten wiersz bro 'textArea.setScrollTop (Double.MAX_VALUE);' – Elltz

+0

Próbowałem zarówno z tą linią, jak i bez niej - ten sam wynik. –

Powiązane problemy