2014-07-21 4 views
0

저는 현재 afterburner.fx를 사용하여 JavaFX 기반 응용 프로그램의 구성 요소를 함께 조정합니다. 지금은 더 편한 유지 관리를 위해 별도의 fxml 파일로 구성 요소를 이동하려고합니다.fx : include와 afterburner를 결합 할 수 있습니까

중첩 된 구성 요소를 자동으로로드 할 수 있도록 fx : include 지시문을 사용하여 이러한 구성 요소를로드하려면 다음을 수행하십시오.

문제는 자동로드로 인해 루스터가 중첩보기에서 발표자를 얻을 수 있다는 것입니다.

자동로드를 결합하는 동시에 부모 루트의 중첩 된 구성 요소로 작업 할 수 있습니까?

답변

1

이 두 가지가 잘 작동하는 것 같습니다.

Afterburner는 FXML 로더에 컨트롤러 팩터 리를 설정하여 작동합니다. FXML 로더는 표현 자 클래스를 인스턴스화하고 값을 주입하는 것을 담당합니다.

<fx:include> 요소는 포함 된 FXML을로드 할 때 컨트롤러 팩터 리를 전파하므로 포함 된 FXML에 정의 된 컨트롤러에 값을 주입 할 수 있습니다. Afterburner는 주사에 싱글 톤 스코프를 효과적으로 사용하므로 주입 된 필드의 동일한 인스턴스가 사용됩니다. 즉, 서로 다른 발표자 클래스간에 데이터 모델을 쉽게 공유 할 수 있습니다.

포함 된 FXML과 관련된 발표자에 액세스하려면 standard technique for "nested controllers"을 사용하십시오.

따라서, 예를 들어 :

main.fxml :

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

<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.cell.PropertyValueFactory?> 
<?import javafx.geometry.Insets?> 

<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="application.MainPresenter"> 
    <center> 
     <TableView fx:id="table"> 
      <columns> 
       <TableColumn text="First Name" prefWidth="150"> 
       <cellValueFactory> 
        <PropertyValueFactory property="firstName" /> 
        </cellValueFactory> 
       </TableColumn> 
       <TableColumn text="Last Name" prefWidth="150"> 
       <cellValueFactory> 
        <PropertyValueFactory property="lastName" /> 
        </cellValueFactory> 
       </TableColumn> 
       <TableColumn text="Email" prefWidth="200"> 
       <cellValueFactory> 
        <PropertyValueFactory property="email" /> 
        </cellValueFactory> 
       </TableColumn> 
      </columns> 
     </TableView> 
    </center> 
    <bottom> 
     <fx:include source="Editor.fxml" fx:id="editor"> 
      <padding> 
       <Insets top="5" bottom="5" left="5" right="5"/> 
      </padding> 
     </fx:include> 
    </bottom> 
</BorderPane> 

editor.fxml :

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

<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.control.Button?> 

<GridPane xmlns:fx="http://javafx.com/fxml" hgap="5" vgap="10" fx:controller="application.EditorPresenter"> 
    <Label GridPane.rowIndex="0" GridPane.columnIndex="0" text="First Name:"/> 
    <TextField fx:id="firstNameTextField" GridPane.rowIndex="0" GridPane.columnIndex="1"/> 

    <Label GridPane.rowIndex="1" GridPane.columnIndex="0" text="Last Name"/> 
    <TextField fx:id="lastNameTextField" GridPane.rowIndex="1" GridPane.columnIndex="1"/> 

    <Label GridPane.rowIndex="2" GridPane.columnIndex="0" text="Email"/> 
    <TextField fx:id="emailTextField" GridPane.rowIndex="2" GridPane.columnIndex="1"/> 

    <HBox GridPane.rowIndex="3" GridPane.columnIndex="0" GridPane.columnSpan="2"> 
     <Button fx:id="addEditButton" onAction="#addEdit" /> 
    </HBox> 

</GridPane> 

MainPresenter.java :

package application; 

import javax.inject.Inject; 

import javafx.fxml.FXML; 
import javafx.scene.control.TableView; 

public class MainPresenter { 
    @FXML 
    private TableView<Person> table ; 

    // This is the controller (presenter) for the included fxml 
    // It is injected by the FXMLLoader; the rule is that "Controller" needs to be 
    // appended to the fx:id attribute of the <fx:include> tag. 
    // This is not used in this example but is here to demonstrate how to access it 
    // if needed. 
    @FXML 
    private EditorPresenter editorController ; 

    @Inject 
    private DataModel dataModel ; 

    public void initialize() { 
     table.setItems(dataModel.getPeople()); 

     table.getSelectionModel().selectedItemProperty().addListener(
       (obs, oldPerson, newPerson) -> dataModel.setCurrentPerson(newPerson)); 

     dataModel.currentPersonProperty().addListener((obs, oldPerson, newPerson) -> { 
      if (newPerson == null) { 
       table.getSelectionModel().clearSelection(); 
      } else { 
       table.getSelectionModel().select(newPerson); 
      } 
     }); 

     dataModel.getPeople().addAll(
      new Person("Jacob", "Smith", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethan", "Williams", "[email protected]"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]") 
     ); 
    } 
} 

EditorPresenter.java :

package application; 

import javafx.beans.binding.Bindings; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 

import javax.inject.Inject; 

public class EditorPresenter { 
    @FXML 
    private TextField firstNameTextField ; 
    @FXML 
    private TextField lastNameTextField ; 
    @FXML 
    private TextField emailTextField ; 
    @FXML 
    private Button addEditButton ; 

    @Inject 
    private DataModel dataModel ; 

    public void initialize() { 
     addEditButton.textProperty().bind(
      Bindings.when(Bindings.isNull(dataModel.currentPersonProperty())) 
       .then("Add") 
       .otherwise("Update") 
     ); 

     dataModel.currentPersonProperty().addListener((obs, oldPerson, newPerson) -> { 
      if (newPerson == null) { 
       firstNameTextField.setText(""); 
       lastNameTextField.setText(""); 
       emailTextField.setText(""); 
      } else { 
       firstNameTextField.setText(newPerson.getFirstName()); 
       lastNameTextField.setText(newPerson.getLastName()); 
       emailTextField.setText(newPerson.getEmail()); 
      } 
     }); 
    } 

    @FXML 
    private void addEdit() { 
     Person person = dataModel.getCurrentPerson(); 
     String firstName = firstNameTextField.getText(); 
     String lastName = lastNameTextField.getText(); 
     String email = emailTextField.getText(); 
     if (person == null) { 
      dataModel.getPeople().add(new Person(firstName, lastName, email)); 
     } else { 
      person.setFirstName(firstName); 
      person.setLastName(lastName); 
      person.setEmail(email); 
     } 
    } 
} 

MainView.java :

package application; 

import com.airhacks.afterburner.views.FXMLView; 

public class MainView extends FXMLView { 

} 

Main.java (응용 프로그램 클래스) :

package application; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

import com.airhacks.afterburner.injection.Injector; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     MainView mainView = new MainView(); 
     Scene scene = new Scene(mainView.getView(), 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void stop() throws Exception { 
     Injector.forgetAll(); 
    } 

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

DataModel.java :

package application; 

import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class DataModel { 
    private final ObservableList<Person> people = FXCollections.observableArrayList(); 
    private final ObjectProperty<Person> currentPerson = new SimpleObjectProperty<>(this, "currentPerson"); 

    public ObservableList<Person> getPeople() { 
     return people ; 
    } 

    public final Person getCurrentPerson() { 
     return currentPerson.get(); 
    } 

    public final void setCurrentPerson(Person person) { 
     this.currentPerson.set(person); 
    } 

    public ObjectProperty<Person> currentPersonProperty() { 
     return currentPerson ; 
    } 
} 

그리고 보통 Person.java 예 :

package application; 

import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

public class Person { 
    private final StringProperty firstName = new SimpleStringProperty(this, "firstName"); 
    public final String getFirstName() { 
     return firstName.get(); 
    } 
    public final void setFirstName(String firstName) { 
     this.firstName.set(firstName); 
    } 
    public StringProperty firstNameProperty() { 
     return firstName ; 
    } 

    private final StringProperty lastName = new SimpleStringProperty(this, "lastName"); 
    public final String getLastName() { 
     return lastName.get(); 
    } 
    public final void setLastName(String lastName) { 
     this.lastName.set(lastName); 
    } 
    public StringProperty lastNameProperty() { 
     return lastName ; 
    } 

    private final StringProperty email = new SimpleStringProperty(this, "email"); 
    public final String getEmail() { 
     return email.get(); 
    } 
    public final void setEmail(String email) { 
     this.email.set(email); 
    } 
    public StringProperty emailProperty() { 
     return email ; 
    } 

    public Person(String firstName, String lastName, String email) { 
     setFirstName(firstName); 
     setLastName(lastName); 
     setEmail(email); 
    } 
} 
관련 문제