我是JavaFX的新手并且正在尝试实现聊天系统。我的问题是,我想创建一个倒置列表视图,它将从底部更新其项目。在android中,可以通过在this post中启用“从底部堆栈”来实现。如何在JavaFX中实现这一目标。
答案 0 :(得分: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功能,可以将项目添加到列表中最底部的可见单元格(您的#34;堆栈来自底层&#34;功能),这在核心JavaFX 8库中不存在。如果您愿意,可以file a feature request获得此类功能。
实现此类功能的最佳方式可能是通过ListView的自定义Skin。但是,这将是一项相当复杂的任务。
您可以从按钮&#34;模拟&#34;堆栈通过使用空项预填充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);
}
}
根据需要调整样本,以获得所需的确切功能。
答案 1 :(得分:0)
对于任何可能将此作为问题的人,请使用
Collections.reverse(arrayList);
这很容易,只需要在最后应用以彻底颠倒你的阵列。