2013-12-09 19 views
8

テーブルにレコードが存在しない場合、JavaFxのTableViewのデフォルト機能である「No content in table」というメッセージが表示されます。JavaFx:空のListViewのデフォルトメッセージ

私の質問は、JavaFxのListViewでも同じことが可能ですか?同様に、ListViewにアイテムがない場合は、空白/空のフィールドの代わりにTableViewと同じメッセージが表示されます。

答えて

17

...私はすぐに見ていないよ簡単な方法があるかもしれません: -

listView.setPlaceholder(new Label("No Content In List"));

その100%の作業... 。FXMLで

0

ListViewのためのsetPlaceholderメソッド(テーブルにコンテンツがないときにデフォルトメッセージを設定する)がないとは思えません。

私が使用する回避策は、「コンテンツなし」を示すリスト内のオブジェクトを作成し、それをリストビューに表示して無効にすることです。例えば

 

ObservableList noContent= FXCollections.observableArrayList("No content found"); 
ListView listView = new ListView(noContent); 
listView.setDisable(true); 
 
4

JavaFX8は、リストビューのためsetPlaceholder(...)メソッドを有します。

以前のバージョンでは、何らかの形で自分自身をロールバックする必要がありました。これはちょっとしたハックです。リストビューをスタックペインにラップし、白い四角形とプレースホルダをリストビューの上部に表示します。プレースホルダと四角形は可視プロパティがバインドされているため、リストが空の場合にのみ表示されます。

は、あなたがこれを試してみて

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class ListViewPlaceholderTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final ListView<String> listView = new ListView<>(); 
     final IntegerProperty counter = new SimpleIntegerProperty(); 
     final Button addButton = new Button("Add item"); 
     addButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       counter.set(counter.get()+1); 
       listView.getItems().add("Item "+counter.get()); 
      } 
     }); 
     final Button removeButton = new Button("Remove"); 
     removeButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       listView.getItems().remove(listView.getSelectionModel().getSelectedIndex()); 
      } 
     }); 
     removeButton.disableProperty().bind(Bindings.equal(listView.getSelectionModel().selectedIndexProperty(), -1)); 
     final HBox buttons = new HBox(5); 
     buttons.setPadding(new Insets(10)); 
     buttons.getChildren().addAll(addButton, removeButton); 

     final BorderPane root = new BorderPane(); 
     root.setCenter(createPlaceholderForListView(listView, new Label("No content in List"))); 
     root.setBottom(buttons); 

     final Scene scene = new Scene(root, 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

    private Node createPlaceholderForListView(ListView<?> listView, Node placeholder) { 
     final StackPane pane = new StackPane(); 
     final Rectangle rect = new Rectangle(0, 0, Color.WHITE); 
     rect.widthProperty().bind(listView.widthProperty()); 
     rect.heightProperty().bind(listView.heightProperty()); 
     pane.getChildren().addAll(listView, rect, placeholder); 

     placeholder.visibleProperty().bind(Bindings.isEmpty(listView.getItems())); 
     rect.visibleProperty().bind(placeholder.visibleProperty()); 
     rect.setMouseTransparent(true); 

     return pane ; 
    } 
} 
+0

あなたは正しいです、.setPlaceholder(..)メソッドは、上記の問題を解決するためにすべてのハックを置き換えるのが良いと良いです。 –

+0

JavaFX 8を使用できる状況であれば、これが最善の方法です。 –

1

<ListView fx:id="foundContentList"> 
    <placeholder> 
     <Label text="Nothing found" /> 
    </placeholder> 
</ListView> 
関連する問題