2014-07-02 107 views
1

我是JavaFX的新手,試圖實現一個聊天系統。我的問題是,我想創建一個倒序列表視圖,它將從底部更新它的項目。在Android中,可以通過啓用「從底部堆疊」來實現,如this post。 JavaFX如何實現這一點。來自底部的JavaFX ListView項堆棧

回答

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功能列表中的項目(「從底部堆疊」功能,您的)添加到最底層的最明顯的細胞,例如在覈心JavaFX 8庫中不存在。如果您願意,您可以使用file a feature request獲得此類功能。

可能最好的方式來實現這樣的功能將通過自定義Skin爲ListView。但是,這將是一項相當複雜的任務。

通過預先填充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); 
    } 
} 

調整樣品,你需要得到你所需要的確切功能。

+0

我想你的方法,但項目仍然在列表視圖的頂部。如何像平時的聊天程序一樣將項目的排列更改爲底部? – Indrajith

+0

我編輯了這個問題,使我的問題更加清晰。請參閱。 – Indrajith

0

Flowless,這是ListView的替代方案,讓我們從底部堆疊物品。你只需要重力設置爲REAR創建實例時:

VirtualFlow<String, ?> flow = VirtualFlow.createVertical(
     items, cellFactory, VirtualFlow.Gravity.REAR)