2015-03-13 34 views
5

Nie mogę powiązać kolekcji fxml z niestandardowym szablonem. Oto kod w jaki sposób mogę to zrobić w XAML:Powiązania list JavaFX8 podobne do 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> 

tutaj Modelu:

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

i układ będzie wyglądać podobnie do tego:

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

Czy wiązania możliwy do obserwacji zbiór do niestandardowego szablonu? Próbowałem komórkowej, ale nie mogłem go owinąć wokół głowy, ponieważ wszyscy używali tylko strun.

+0

Co to jest niestandardowy szablon? – jewelsea

+0

Przedłużam moje pytanie, aby dokładniej wyjaśnić konfigurację. Zasadniczo polega to na tym, że dla każdej pozycji w kolekcji stosowany jest szablon.Tak więc dla każdej pozycji w kolekcji PersonCollection generowany jest horyzontalny panel stackpanel, imię, etykieta lastname i inny widok listy z szablonem. – kadir

+0

Gdzie i jak określasz dane wejściowe (np. John Ivy, Robert Downey Junior itp.)? Czy to jest statyczne i nigdy nie zmienia się ani nie zmienia dynamicznych danych, które zmieniają się w czasie wykonywania? Czy na pewno naprawdę chcesz [ListView] (http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/list-view.htm#CEGGEDBF) tutaj (bo to byłoby dziwne) lub czy to coś zupełnie innego niż ListView JavaFX? (Nie mam żadnej znajomości z xaml). – jewelsea

Odpowiedz

5

nie jestem w 100% pewien, że to jest odpowiedź na pytanie, jak jestem całkowicie zaznajomiony z XAML, ale mam nadzieję, że to jest ...

Próbka Realizacja

Prace próbki przez ustawienie model obiektu (osoba) do przestrzeni nazw programu ładującego FXML, który umożliwia użycie wyrażenia wiążącego w FXML w celu powiązania właściwości obiektu.

W próbce początkowo występuje kilka nazw w modelu i można modyfikować powiązaną listę w modelu za pomocą przycisków dodawania i usuwania w celu dodania lub usunięcia kilku dalszych nazw puszek na liście.

sample image

Cały kod idzie w pakiecie o nazwie sample.names.

imieniny 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); 
    } 
} 

Alternatywne Implementacje

mogą istnieć inne (być może bardziej korzystne sposoby) w ten sposób - na przykład przez powiązanie wiązań elementów w kodzie zamiast FXML (co zwykle robię) lub wstrzyknięcie modelu za pomocą systemu wstrzykiwania zależności. Zobacz afterburner.fx dla przykładu metody iniekcji - choć nie wiem, czy dopalacz również umieszcza obiekty modelu w przestrzeni nazw FXML lub po prostu wtryskuje się do kontrolera (jeśli nie wykonuje iniekcji w przestrzeni nazw FXML, która może być cool dodatek możesz poprosić o to).

+0

Jest to podobne do postępu, w jakim się pojawiłem, ale nie byłem w stanie stworzyć szablonu innego niż Strings. Co jeśli chcę listę przycisków i paneli? Czy to jest możliwe? Jestem zadowolony z odpowiedzi "nie". – kadir

+1

@kadir Następnie musisz określić właściwości komórki. – Puce