我想讓TextArea自動滾動到底部,並通過事件處理程序放入新文本。每個新條目都只是一長串文本,每個條目都用換行符分隔。我試過一個更改處理程序,它將setscrolltop設置爲Double.MIN_VALUE,但無濟於事。任何想法如何做到這一點?JavaFX TextArea和自動滾動
12
A
回答
20
你有一個監聽器添加到TextArea
元素滾動至底部時,它的值改爲:
@FXML private TextArea txa;
...
txa.textProperty().addListener(new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<?> observable, Object oldValue,
Object newValue) {
txa.setScrollTop(Double.MAX_VALUE); //this will scroll to the bottom
//use Double.MIN_VALUE to scroll to the top
}
});
但是當你使用setText(text)
方法,因此,如果要將此偵聽器未觸發觸發它後setText(text)
使用appendText(text)
後馬上:
txa.setText("Text into the textArea"); //does not trigger the listener
txa.appendText(""); //this will trigger the listener and will scroll the
//TextArea to the bottom
這聽起來更像是一個錯誤,一旦setText()
應該觸發changed
監聽器,但它ð oesn't。這是我使用自己的解決方法,並希望它可以幫助你。
7
txa.appendText(「」)將滾動到底部,沒有聽衆。如果您想要回滾並且文本正在不斷更新,則會成爲問題。 txa.setText(「」)將滾動條放回頂部,同樣的問題也適用。
我的解決方案是擴展TextArea類,將FXML標記從textArea改爲LogTextArea。當這個作品,這顯然會導致現場建設者的問題,因爲它不知道這是什麼成分是
import javafx.scene.control.TextArea;
import javafx.scene.text.Font;
public class LogTextArea extends TextArea {
private boolean pausedScroll = false;
private double scrollPosition = 0;
public LogTextArea() {
super();
}
public void setMessage(String data) {
if (pausedScroll) {
scrollPosition = this.getScrollTop();
this.setText(data);
this.setScrollTop(scrollPosition);
} else {
this.setText(data);
this.setScrollTop(Double.MAX_VALUE);
}
}
public void pauseScroll(Boolean pause) {
pausedScroll = pause;
}
}
3
替代那個奇怪的setText錯誤,而無需使用AppendText通過
textArea.selectPositionCaret(textArea.getLength());
textArea.deselect(); //removes the highlighting
1
一編我會增加jamesarbrown的對此的迴應將是使用布爾屬性,以便您可以從FXML中訪問它。 就是這樣。
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.control.TextArea;
public class LogTextArea extends TextArea {
private final BooleanProperty pausedScrollProperty = new SimpleBooleanProperty(false);
private double scrollPosition = 0;
public LogTextArea() {
super();
}
public void setMessage(String data) {
if (isPausedScroll()) {
scrollPosition = this.getScrollTop();
this.setText(data);
this.setScrollTop(scrollPosition);
} else {
this.setText(data);
this.setScrollTop(Double.MAX_VALUE);
}
}
public final BooleanProperty pausedScrollProperty() { return pausedScrollProperty; }
public final boolean isPausedScroll() { return pausedScrollProperty.getValue(); }
public final void setPausedScroll(boolean value) { pausedScrollProperty.setValue(value); }
}
然而,這個答案的問題是,如果你得到一個不合理的大量投入淹沒(可檢索從IO流日誌時發生)JavaFX的線程將鎖定,因爲文本區得到數據太多。
相關問題
- 1. 如何控制JavaFX TextArea自動滾動?
- 2. 如何在JavaFX和Java 8中禁用TextArea自動滾動?
- 3. JavaFX TextArea滾動條移動事件
- 4. 自動向下滾動TextArea
- 5. Textarea自動向下滾動
- 6. JavaFX:使用appendText自動滾動TextArea,但沒有Listeners
- 7. 如何禁用javaFx中的textArea自動滾動java8
- 8. javaFX中的自動滾動
- 9. 禁用自動滾動TextArea中
- 10. 使用Javascript自動滾動<textarea>
- 11. textarea自動滾動到底部
- 12. Readonly textarea和IE9滾動條
- 13. javafx滾動條
- 14. Textarea和自定義滾動條 - jQuery自定義內容滾動條
- 15. 動態滾動textarea到bottomome
- 16. JavaFX自動滾動自動更新文本
- 17. Textarea lineheight滾動後
- 18. TextArea高度和滾動條滾動條之間的相互關係TopProperty
- 19. 如何禁用的textarea的滾動條在JavaFX
- 20. UITextField和UITableViewCell自動滾動
- 21. 平滑滾動和重點textarea的
- 22. JavaFX滾動開始和結束
- 23. 啓用垂直滾動textarea
- 24. 防止textarea垂直滾動
- 25. 滾動java TextArea的問題
- 26. textarea停止滾動android
- 27. HTML Textarea水平滾動
- 28. 全屏textarea無滾動條
- 29. QML TextArea不會滾動
- 30. 滾動<textarea>在iPhone
您的評論已被刪除(不是我),因爲您已將其發佈爲答案。我在那裏回覆說,你可能想接受你所判斷的答案是正確的,讓其他人知道你找到了滿足你的解決方案。爲了做到這一點,除了你喜歡的答案之外,還要點擊'V',讓它變成綠色。這也適用於你的[自己的答案](http://stackoverflow.com/questions/19122056/camel-jpa-component-forcing-a-commit) – Math