2013-12-09 11 views
8

के लिए डिफ़ॉल्ट संदेश जब किसी तालिका यह संदेश 'तालिका में कोई सामग्री' है, जो JavaFX में tableview के डिफ़ॉल्ट कार्यक्षमता के द्वारा होता है पता चलता में कोई रिकॉर्ड नहीं है।JavaFX: खाली ListView

तो यहाँ मेरे सवाल है, एक ही संभव JavaFX में ListView साथ हो सकता है करता है? जैसे, यदि किसी भी सूची दृश्य में कोई आइटम नहीं है तो यह रिक्त/खाली फ़ील्ड के बजाय टेबलव्यू के समान संदेश दिखाएगा।

उत्तर

17

आप इस कोशिश करने के लिए है: -

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

अपने 100% काम कर रहे ... ।

0

पूरी तरह से सुनिश्चित नहीं है लेकिन मुझे नहीं लगता कि ListView के लिए setPlaceholder विधि (तालिका में कोई सामग्री नहीं होने पर डिफ़ॉल्ट संदेश सेट करने के लिए) है।

वैकल्पिक हल है कि मैं का उपयोग करें सूची में एक वस्तु है कि "कोई भी सामग्री" से संकेत मिलता है और उस सूचीदृश्य और भी पर उसे निष्क्रिय दिखाने तैयार करना है।

उदाहरण के लिए:

 

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

JavaFX8 ListView के लिए एक setPlaceholder (...) विधि है।

पिछले संस्करणों में, आपको अपना खुद का रोल रोल करने की आवश्यकता है। यह एक हैक का एक सा है: यह एक स्टैक फलक में सूची दृश्य को लपेटता है, जिसमें एक सफेद आयताकार और प्लेसहोल्डर सूची दृश्य के शीर्ष पर प्रदर्शित होता है। प्लेसहोल्डर और आयत में उनकी दृश्यमान संपत्ति बाध्य है, इसलिए यदि सूची खाली है तो वे केवल तभी दिखाई दे रहे हैं।

वहाँ आसान तरीके है कि मैं अभी नहीं दिखाई दे रहा हो सकता है ...

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

आप सही हैं, .setPlaceholder (..) विधि सभी हैक को प्रतिस्थापित करने के लिए अच्छा है और उपर्युक्त समस्या को हल करने में आसान है। –

+0

जब तक आप ऐसी स्थिति में हों जहां आप JavaFX 8 का उपयोग कर सकते हैं, यह सबसे अच्छा तरीका है। –

1
fxml साथ

:

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