2013-12-09 16 views
8

Herhangi bir tabloda herhangi bir kayıt olmadığında, 'Tabloda içerik yok' iletisi görüntülenir; bu, JavaFx'te TableView'ın varsayılan işlevidir.JavaFx: Boş Liste Görünümü için Varsayılan İleti

İşte benim sorum şu, aynı JavaFx içinde ListView ile mümkün olabilir mi? ListView'de herhangi bir öğe yoksa, boş/boş alanlar yerine TableView ile aynı mesajı gösterir.

cevap

17

... Hemen göremiyorum kolay yolları olabilir: -

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

onun% 100 çalışma ... .

fxml ile
0

Tam olarak emin değilim ama ListView için setPlaceholder yönteminin (tablodaki hiçbir içerik olmadığında varsayılan mesajı ayarlamak için) olduğunu sanmıyorum.

Kullandığım geçici çözüm, listede "İçerik yok" u gösteren ve liste görünümünde bunu gösteren ve bunu devre dışı bırakan bir Nesne oluşturmaktır. Örneğin

:

 

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

JavaFX8 ListView bir setPlaceholder (...) yöntemi vardır. Önceki sürümlerde, kendi türünüzü bir şekilde döndürmeniz gerekir. Bu bir kesmek gibidir: ListView'i bir yığın bölmesinde, beyaz bir dikdörtgen ve liste görünümünün üst kısmında görüntülenen yer tutucu ile sarar. Yer tutucu ve dikdörtgende görünen mülkler sınırlıdır, bu nedenle yalnızca liste boşsa görünürler.

Bunu denemek zorunda

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

Haklısınız, .setPlaceholder (..) yöntemi, tüm kesmek yerine geçmek ve yukarıda bahsedilen sorunumu çözmek kolay. –

+0

JavaFX 8'i kullanabileceğiniz bir durumda olduğunuz sürece, bu en iyi yoldur. –

1

:

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