2013-12-09 11 views
8

Quando non vi è alcun record in alcuna tabella, viene visualizzato un messaggio "Nessun contenuto nella tabella", che è la funzionalità predefinita di TableView in JavaFx.JavaFx: messaggio predefinito per ListView vuoto

Quindi la mia domanda è, la stessa cosa può essere possibile con ListView in JavaFx? Ad esempio, se non ci sono elementi in alcun ListView, mostrerà un messaggio uguale a TableView, invece di un campo vuoto/vuoto.

risposta

17

Dovete provare questo: -

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

suo 100% di lavoro ... .

0

Non completamente sicuro ma non penso che ci sia un metodo setPlaceholder (per impostare il messaggio predefinito quando nessun contenuto nella tabella) per ListView.

La soluzione che utilizzo è creare un oggetto nell'elenco che indica "Nessun contenuto" e mostrarlo nell'elenco e disabilitarlo.

Ad esempio:

 

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

JavaFX8 ha un metodo setPlaceholder (...) per ListView.

Nelle versioni precedenti, è necessario eseguire il rollover in qualche modo. Questo è un po 'un trucco: avvolge il ListView in un riquadro dello stack, con un rettangolo bianco e il segnaposto visualizzato sopra la parte superiore della visualizzazione elenco. Il segnaposto e il rettangolo hanno la loro proprietà visibile vincolata, quindi sono visibili solo se l'elenco è vuoto.

Ci possono essere modi più semplici che non sto vedendo subito ...

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

Hai ragione, il metodo .setPlaceholder (..) è buono per sostituire tutto l'hack e facile per risolvere il mio problema sopra detto. –

+0

Finché ci si trova in una situazione in cui è possibile utilizzare JavaFX 8, questo è il modo migliore. –

1

Con fxml:

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