JavaFx:空ListView的默认消息

时间:2013-12-09 11:36:53

标签: java listview javafx javafx-2 javafx-8

当任何表中没有记录时,它会显示一条消息“表中没有内容”,这默认是JavaFx中TableView的功能。

所以我的问题是,JavaFx中的ListView是否可以实现相同的目标?比如,如果任何ListView中没有项目,那么它将显示与TableView相同的消息,而不是空白/空字段。

4 个答案:

答案 0 :(得分:17)

你必须尝试这个: -

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

100%工作....

答案 1 :(得分:4)

JavaFX8为ListView提供了setPlaceholder(...)方法。

在早期版本中,您需要以某种方式滚动自己。这有点像黑客攻击:它将ListView包装在一个堆栈窗格中,带有一个白色矩形,占位符显示在列表视图的顶部。占位符和矩形的可见属性绑定,因此只有在列表为空时才可见。

我可能没有立即看到的方式......

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

答案 2 :(得分:1)

使用fxml:

<ListView fx:id="foundContentList">
    <placeholder>
        <Label text="Nothing found" />
    </placeholder>
</ListView>

答案 3 :(得分:0)

不完全确定,但我认为ListView没有setPlaceholder方法(在表中没有内容时设置默认消息)。

我使用的解决方法是在列表中创建一个指示“无内容”的对象,并在列表视图中显示该对象并禁用它。

例如:


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