2016-08-05 82 views
7

这是我的一段代码。JavaFX:textArea.setScrollTop(Double.MAX_VALUE)并不总是有效

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

我用textArea.setScrollTop(Double.MAX_VALUE)滚动文本区域的底部(解决方案,我在互联网上找到)。它有效,但并非总是如此。我注意到,只有在调用此代码之前垂直滚动条不可见并且代码执行后才可见,它才能工作。在调用此代码之前,垂直滚动条可见时,滚动到底部始终工作。如何解决它?也许我应该让垂直滚动条始终可见?如果是,那么如何 - 我没有找到解决方案。

编辑: 这是示例代码:

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(); 
    } 
} 

这是当我按下按钮4次结果: enter image description here 正如你看到它没有滚动至底部。在我再次按下按钮(第五次)后,我得到以下结果: enter image description here 现在,如您所见,它被滚动到底部。 我尝试添加:

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

,使滚动条始终可见 - 它是可见的,但经过4次反正不滚动至底部。

如何解决?

+0

这是一个错误,所以我打开了一个错误报告。请参阅https://bugs.openjdk.java。net/browse/JDK-8189732 –

回答

1

如果要滚动到顶部,如果你想滚动至底部,您的代码将是这个样子

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

现在让TextArea您的代码将是这个样子

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

担心其可见区域

编辑

也许我没有得到你的需求,导致老老实实这是我第一次看到这样的方法给基于你的假设

也许我应该做垂直滚动条总是可见的答案吗?如果是的话,那么如何

以及多数民众赞成容易TextArea使用ScrollPane,时有可见滚动 此行TextArea.getChildrenUnmodifiable().size();将检查出是1,所以你钓出来当你创建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); 
         } 
        } 
       } 
      } 
     } 
    }); 

其实你可以保持到ScrollPane参考,并随时要滚动至底部ScrollPane.setVvalue(1.0);顶端ScrollPane.setVvalue(0.0);等等等等

你可以用ScrollPane.getVvalue()得到价值。

+0

谢谢你的想法,但它没有帮助。看我的编辑。 –

+0

@ JimJim2000删除此行bro'textArea.setScrollTop(Double.MAX_VALUE);' – Elltz

+0

我试过这两行,没有它 - 结果相同。 –