首页 文章

JavaFx:空ListView的默认消息

提问于
浏览
8

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

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

4 回答

  • 17

    你必须尝试这个: -

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

    它100%工作....

  • 0

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

    使用fxml:

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

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

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

    例如:

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

相关问题