2015-03-13 11 views
5

जैसा कि मैं एक अनुकूलित टेम्पलेट में संग्रह को fxml में बांधने में असमर्थ हूं। यहाँ कोड है कि कैसे मैं XAML में यह करना होगा:JavaFX8 सूची बाइंडिंग xaml

<ListView ItemsSource="{Binding PersonCollection}"> 
    <StackPanel Orientation="Horizontal"> 
     <Label Content="{Binding FirstName}"></Label> 
     <ListView ItemsSource="{Binding MiddleNames}"> 
      <Label Content="{Binding}"></Label> 
     </ListView> 
     <Label Content="{Binding LastName}"></Label> 
    </StackPanel> 
</ListView> 
यहाँ

मॉडल:

class Person 
{ 
    String FirstName, LastName; 
    String[] MiddleNames; 
} 

और लेआउट इस के समान दिखेगा:

John Ivy 
Robert Downey Junior 
Max more middlenames in fact even thousands are possible lastname 

एक के बंधन है एक अनुकूलित टेम्पलेट के लिए oberservable संग्रह संभव है? मैंने सेलफैक्टरी की कोशिश की लेकिन मेरे सिर को इसके चारों ओर लपेट नहीं पाया, क्योंकि हर कोई केवल तारों का उपयोग करता था।

+0

एक अनुकूलित टेम्पलेट क्या है? – jewelsea

+0

मैंने सेटअप को और समझाने के लिए अपना प्रश्न बढ़ाया। यह अनिवार्य रूप से क्या करता है, संग्रह में प्रत्येक आइटम के लिए टेम्पलेट लागू किया जाता है।तो व्यक्ति चयन में प्रत्येक आइटम के लिए यह एक क्षैतिज stackpanel, firstname लेबल, lastname लेबल और टेम्पलेट के साथ एक और सूचीदृश्य उत्पन्न करता है। – kadir

+0

आप इनपुट डेटा कहां और कैसे निर्दिष्ट करते हैं (जैसे जॉन आइवी, रॉबर्ट डाउनी जूनियर आदि)? क्या यह स्थैतिक है और कभी भी परिवर्तन या डायनामिक डेटा नहीं है जो रनटाइम पर बदलता है? क्या आप वाकई एक [ListView] (http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/list-view.htm#CEGGEDBF) चाहते हैं (कारण यह अजीब होगा) या क्या वास्तव में जावाएफएक्स सूची दृश्य से कुछ अलग है? (मुझे xaml के साथ बिल्कुल कोई परिचितता नहीं है)। – jewelsea

उत्तर

5

मैं 100% यकीन नहीं इस अपने प्रश्न का उत्तर है के रूप में मैं XAML के साथ पूरी तरह से अपरिचित हूँ, लेकिन उम्मीद है कि यह है हूँ ...

नमूना कार्यान्वयन

की स्थापना करके नमूना काम करता है मॉडल ऑब्जेक्ट (व्यक्ति) FXML लोडर के नामस्थान में, जो आपको ऑब्जेक्ट के गुणों से जुड़ने के लिए FXML में बाध्यकारी अभिव्यक्ति का उपयोग करने की अनुमति देता है।

नमूना में, मॉडल में शुरुआती कुछ नाम हैं और आप सूची में कुछ और डिब्बाबंद नाम जोड़ने या निकालने के लिए बटन जोड़ने और निकालने के लिए मॉडल में बाध्य सूची को संशोधित कर सकते हैं।

sample image

सभी कोड एक पैकेज नामित sample.names में चला जाता है।

नाम-display.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ListView?> 
<?import javafx.scene.layout.HBox?> 

<?import javafx.geometry.Insets?> 

<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.control.Button?> 
<VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.names.NameDisplayController"> 
    <HBox prefHeight="150.0" prefWidth="220.0" spacing="5.0" > 
    <children> 
     <Label fx:id="firstNameLabel" text="${person.firstName}" /> 
     <ListView fx:id="middleNameList" prefWidth="100.0" items = "${person.middleNames}" /> 
     <Label fx:id="lastNameLabel" text="${person.lastName}" /> 
    </children> 
    <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
    </padding> 
    </HBox> 
    <HBox alignment="CENTER" spacing="30.0"> 
    <children> 
     <Button mnemonicParsing="false" onAction="#addName" text="Add" /> 
     <Button mnemonicParsing="false" onAction="#removeName" text="Remove" /> 
    </children> 
    <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
    </padding> 
    </HBox> 
</VBox> 

NameDisplayApp.java

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

import java.io.IOException; 

public class NameDisplayApp extends Application { 

    @Override 
    public void start(Stage stage) throws IOException { 
     Person person = new Person(
       "Bruce", 
       new String[] { "Simon", "Larry" }, 
       "Banner" 
     ); 

     FXMLLoader loader = new FXMLLoader(
       getClass().getResource(
         "name-display.fxml" 
       ) 
     ); 
     loader.getNamespace().put(
       "person", 
       person 
     ); 
     Pane pane = loader.load(); 

     NameDisplayController controller = loader.getController(); 
     controller.setPerson(person); 

     stage.setScene(new Scene(pane)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

NameDisplayController.java

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 

public class NameDisplayController { 
    private Person person; 

    private ObservableList<String> sampleNames = FXCollections.observableArrayList(
      "George", "Henry", "Wallace" 
    ); 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    public void addName(ActionEvent actionEvent) { 
     if (!sampleNames.isEmpty()) { 
      person.getMiddleNames().add(
       sampleNames.remove(0) 
      ); 
     } 
    } 

    public void removeName(ActionEvent actionEvent) { 
     if (!person.getMiddleNames().isEmpty()) { 
      sampleNames.add(
        person.getMiddleNames().remove(0) 
      ); 
     } 
    } 
} 

Person.java

import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class Person { 
    public StringProperty firstName; 
    public StringProperty lastName; 

    private ObservableList<String> middleNames; 

    public Person(String firstName, String[] middleNames, String lastName) { 
     this.firstName = new SimpleStringProperty(firstName); 
     this.middleNames = FXCollections.observableArrayList(middleNames); 
     this.lastName = new SimpleStringProperty(lastName); 
    } 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public StringProperty firstNameProperty() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName.set(firstName); 
    } 

    public ObservableList<String> getMiddleNames() { 
     return middleNames; 
    } 

    public String getLastName() { 
     return lastName.get(); 
    } 

    public StringProperty lastNameProperty() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName.set(lastName); 
    } 
} 

वैकल्पिक कार्यान्वयन

हो सकता है अन्य (शायद अधिक पसंदीदा तरीके) ऐसा करने का - जैसे एफएक्सएमएल (जो मैं आमतौर पर करता हूं) के बजाय कोड में वस्तुओं की बाइंडिंग को जोड़कर या एक निर्भरता इंजेक्शन सिस्टम का उपयोग कर मॉडल इंजेक्शन द्वारा। इंजेक्शन दृष्टिकोण के उदाहरण के लिए afterburner.fx देखें - हालांकि मुझे नहीं पता कि आफ्टरबर्नर भी एफएक्सएमएल नेमस्पेस में मॉडल ऑब्जेक्ट्स रखता है या केवल नियंत्रक में इंजेक्ट करता है (यदि यह FXML नेमस्पेस में इंजेक्शन नहीं करता है जो ठंडा हो सकता है इसके अलावा आप इसके लिए अनुरोध कर सकते हैं)।

+0

यह मेरी प्रगति के समान है, फिर भी मैं स्ट्रिंग्स से कुछ और टेम्पलेट करने में असमर्थ था। अगर मैं बटन या पैन की एक सूची चाहता हूं तो क्या होगा? क्या यह संभव है? मैं उत्तर संख्या के साथ भी संतुष्ट हूं। – kadir

+1

@ कदीर फिर आपको सेलफैक्टरी निर्दिष्ट करना होगा। – Puce