JavaFX ListView项目从底部堆叠

Ind*_*ith 1 listview javafx-8

我是JavaFX的新手,正在尝试实现聊天系统.我的问题是,我想创建一个倒置列表视图,它将从底部更新其项目.在android中,它可以通过启用"从底部堆栈"来实现,就像在这篇文章中一样.如何在JavaFX中实现这一目标.

jew*_*sea 5

只需在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来模拟"从按钮堆栈"功能,因此新项目将添加到列表的底部(在添加新项目时删除虚拟空项目).以下是这种方法的示例:

stackedfrombottom

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)

根据需要调整样本,以获得所需的确切功能.