我是JavaFX的新手,試圖實現一個聊天系統。我的問題是,我想創建一個倒序列表視圖,它將從底部更新它的項目。在Android中,可以通過啓用「從底部堆疊」來實現,如this post。 JavaFX如何實現這一點。來自底部的JavaFX ListView項堆棧
1
A
回答
5
只需在ListView的項目列表中的第0個索引處添加新項目。
listView.getItems().add(0, newItem);
示例應用程序
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
public class ListViewViewer extends Application {
@Override
public void start(Stage stage) {
ListView<String> list = new ListView<>();
ObservableList<String> items = list.getItems();
items.add(0, "1");
items.add(0, "2");
items.add(0, "3");
items.add(0, "4");
stage.setScene(new Scene(list));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果你想要的是1,2,3,4,而不是4,3,2,1作爲示例,然後只需將新項目添加到項目列表中,而不指定插入索引:
listView.getItems().add(newItem);
項目列表是一個可觀察列表,所以如果您更改可觀察列表中的項目順序(例如,你對它進行排序或洗牌),更新的項目順序將立即反映在ListView中。
基於新的問題更新答案
你鏈接的文章中提到的Android功能列表中的項目(「從底部堆疊」功能,您的)添加到最底層的最明顯的細胞,例如在覈心JavaFX 8庫中不存在。如果您願意,您可以使用file a feature request獲得此類功能。
可能最好的方式來實現這樣的功能將通過自定義Skin爲ListView。但是,這將是一項相當複雜的任務。
通過預先填充ListView和空項目,可以模擬「從按鈕堆疊」功能,因此新項目被添加到列表底部(添加新項目時刪除虛擬空項目)。這是這種方法的一個樣本:
import javafx.animation.*;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
import javafx.util.Duration;
public class ListViewViewer extends Application {
private static final int MAX_MESSAGES = 20;
private static final int DISPLAYED_MESSAGES = 8;
private static final int CELL_HEIGHT = 24;
private int msgNum = 0;
@Override
public void start(Stage stage) {
ListView<String> list = new ListView<>();
ObservableList<String> items = list.getItems();
for (int i = 0; i < DISPLAYED_MESSAGES; i++) {
items.add("");
}
list.setMinHeight(ListView.USE_PREF_SIZE);
list.setPrefHeight(DISPLAYED_MESSAGES * CELL_HEIGHT + 2);
list.setMaxHeight(ListView.USE_PREF_SIZE);
stage.setScene(new Scene(list));
stage.setResizable(false);
stage.show();
simulateMessaging(list);
}
private void addMessage(ObservableList<String> items, String message) {
if (items.get(0).equals("") || items.size() >= MAX_MESSAGES) {
items.remove(0);
}
items.add(message);
}
private void simulateMessaging(ListView<String> list) {
Timeline messageMaker = new Timeline(
new KeyFrame(
Duration.seconds(1),
event -> {
addMessage(list.getItems(), nextMessage());
if (list.getItems().size() > DISPLAYED_MESSAGES) {
list.scrollTo(list.getItems().size() - 1);
}
}
)
);
messageMaker.setCycleCount(Timeline.INDEFINITE);
PauseTransition pause = new PauseTransition(Duration.seconds(2));
pause.setOnFinished(event -> messageMaker.play());
pause.play();
}
private String nextMessage() {
return "msg " + msgNum++;
}
public static void main(String[] args) {
launch(args);
}
}
調整樣品,你需要得到你所需要的確切功能。
0
Flowless,這是ListView
的替代方案,讓我們從底部堆疊物品。你只需要重力設置爲REAR
創建實例時:
VirtualFlow<String, ?> flow = VirtualFlow.createVertical(
items, cellFactory, VirtualFlow.Gravity.REAR)
相關問題
- 1. 使用jquery從「堆棧」的底部到頂部帶來圖像
- 2. GDB如何確定堆棧的底部?
- 3. 將堆棧對齊到RelativeLayout的底部?
- 4. 從底部的Android GridView堆棧
- 5. 堆棧搖擺元素底部
- 6. 總是有活動在底部堆棧
- 7. IL無堆棧變量的堆棧項的頂部複製
- 8. 添加依賴項來堆棧項目?
- 9. 如何遞歸交換堆棧的頂部元素到底部
- 10. 如何將頂部div移動到堆棧的底部
- 11. 如何堆棧頂部的div至底部CSS
- 12. 來自堆棧onResume的流行活動
- 13. 來自Book的C++堆棧示例?
- 14. 的JavaFX如何讓底部
- 15. 使用存儲在堆棧(JavaFX的)
- 16. 遞歸基本上會到達「堆棧」的底部,然後反彈回來嗎?
- 17. ListView最後一項與底部對齊
- 18. 帶GridLayoutManager的RecyclerView和底部的反向佈局堆棧
- 19. 無底堆棧的空指針異常
- 20. AWS - 自動部署(.NET)到CloudFormation堆棧
- 21. 從全局活動回調到堆棧底部的活動
- 22. 停靠在底部的堆棧面板,並添加列定義
- 23. 如何從excel中的堆棧填充底部配額
- 24. 如何窺視堆棧底部的物體?
- 25. 是否有添加到C++堆棧底部的函數?
- 26. 頂部堆棧tbody
- 27. 堆棧UICollectionView部分
- 28. 如何刪除不在C#中堆棧頂部的堆棧項目
- 29. 打印堆棧跟蹤到JavaFX中
- 30. JVM堆棧自檢
我想你的方法,但項目仍然在列表視圖的頂部。如何像平時的聊天程序一樣將項目的排列更改爲底部? – Indrajith
我編輯了這個問題,使我的問題更加清晰。請參閱。 – Indrajith