JavaFX ListView项目从底部堆叠

时间:2014-07-02 13:55:17

标签: listview javafx-8

我是JavaFX的新手并且正在尝试实现聊天系统。我的问题是,我想创建一个倒置列表视图,它将从底部更新其项目。在android中,可以通过在this post中启用“从底部堆栈”来实现。如何在JavaFX中实现这一目标。

2 个答案:

答案 0 :(得分:5)

只需在ListView项目列表的第0个索引处添加新项目。

listView.getItems().add(0, newItem);

示例应用

reversed

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的功能,因此新项目将添加到列表的底部(在添加新项目时删除虚拟空项目)。以下是这种方法的示例:

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);
    }
}

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

答案 1 :(得分:0)

对于任何可能将此作为问题的人,请使用

Collections.reverse(arrayList);

这很容易,只需要在最后应用以彻底颠倒你的阵列。