当任何表中没有记录时,它会显示一条消息“表中没有内容”,这默认是JavaFx中TableView的功能 .
所以我的问题是,JavaFx中的ListView是否可以实现相同的目标?就像,如果任何ListView中没有项目,那么它将显示与TableView相同的消息,而不是空白/空字段 .
你必须尝试这个: -
listView.setPlaceholder(new Label("No Content In List"));
它100%工作....
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 ; } }
使用fxml:
<ListView fx:id="foundContentList"> <placeholder> <Label text="Nothing found" /> </placeholder> </ListView>
不完全确定,但我认为ListView没有 setPlaceholder 方法(在表中没有内容时设置默认消息) .
setPlaceholder
我使用的解决方法是在列表中创建一个指示“无内容”的对象,并在列表视图中显示该对象并禁用它 .
例如:
ObservableList noContent= FXCollections.observableArrayList("No content found"); ListView listView = new ListView(noContent); listView.setDisable(true);
4 回答
你必须尝试这个: -
listView.setPlaceholder(new Label("No Content In List"));
它100%工作....
JavaFX8为ListView提供了setPlaceholder(...)方法 .
在早期版本中,您需要以某种方式滚动自己 . 这有点像黑客攻击:它将ListView包装在一个堆栈窗格中,带有一个白色矩形,占位符显示在列表视图的顶部 . 占位符和矩形的可见属性绑定,因此只有列表为空时才可见 .
可能有更简单的方法让我马上看不到......
使用fxml:
不完全确定,但我认为ListView没有
setPlaceholder
方法(在表中没有内容时设置默认消息) .我使用的解决方法是在列表中创建一个指示“无内容”的对象,并在列表视图中显示该对象并禁用它 .
例如: