我是JavaFX的新手,正在尝试实现聊天系统.我的问题是,我想创建一个倒置列表视图,它将从底部更新其项目.在android中,它可以通过启用"从底部堆栈"来实现,就像在这篇文章中一样.如何在JavaFX中实现这一目标.
只需在ListView的项目列表中的第0个索引处添加新项目.
listView.getItems().add(0, newItem);
Run Code Online (Sandbox Code Playgroud)
示例应用程序

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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想要的是1,2,3,4而不是样本中的4,3,2,1,那么只需将新项添加到项列表中而不指定插入索引:
listView.getItems().add(newItem);
Run Code Online (Sandbox Code Playgroud)
项目列表是一个可观察的列表,因此如果您更改可观察列表中的项目顺序(例如,您对其进行排序或随机播放),更新的项目顺序将立即反映在ListView中.
根据更新的问题更新了答案
您链接的文章提到Android功能,以将项添加到列表中最底部的可见单元格(您的"从底部堆栈"功能),这在核心JavaFX 8库中不存在.如果您愿意,可以提交此功能的功能请求.
实现此类功能的最佳方式可能是通过ListView 的自定义Skin.但是,这将是一项相当复杂的任务.
您可以通过使用空项目预先填充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);
}
}
Run Code Online (Sandbox Code Playgroud)
根据需要调整样本,以获得所需的确切功能.
| 归档时间: |
|
| 查看次数: |
2367 次 |
| 最近记录: |