2017-02-08 5 views
1

Я получил простое приложение, которое имеет свои элементы, определенные в файле .FXMLJavaFX перемещения свойства FXML к separateclass/боба

<TextField fx:id="httpsPort" promptText="text1" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
<TextField fx:id="adminPort" promptText="text2" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 

до сих пор я делал это

public class Controller { 
    public TextField httpsPort; 
    public TextField adminPort; 

    //getters and setters here 
} 

но я 'd хотел бы делать это в контроллере

public class Controller { 

    //maybe some magic annotation here 
    public Layout layout; 

    //the rest of the code 
} 


public class Layout { 

    public TextField httpsPort; 
    public TextField adminPort; 

} 

так что в основном, я хотел бы выделить объекты, которые подключены к layou t в другой класс, используя либо аннотацию, xml-конфигурацию и т. д. Есть ли какой-либо известный способ достичь этого?

+0

Какова цель отделения контролируемых полей от контроллера? –

+0

очиститель код думаю –

ответ

1

Использование <fx:include>:

ports.fxml:

<GridPane fx:controller="com.mycompany.Layout"> 

    <TextField fx:id="httpsPort" promptText="text1" GridPane.columnIndex="1" GridPane.rowIndex="1" /> 
    <TextField fx:id="adminPort" promptText="text2" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 

</GridPane> 

, а затем main.fxml:

< ... fx:controller="com.mycompany.MainController"> 
    <!-- ... --> 
    <fx:include fx:id="layout" source="ports.fxml"/> 
    <!-- ... --> 

MainController Ваш может сделать:

public class MainController { 

    @FXML 
    private Layout layoutController ; // field name is fx:id with "Controller" appended 

} 

и Layout является

public class Layout { 

    @FXML 
    private TextField httpsPort; 
    @FXML 
    private TextField adminPort; 

} 

Смотрите раздел документации по Nested Controllers (или десятки подобных вопросов на этом сайте) для более подробной информации.

+0

удивительный! Благодарю. собираюсь дать этот шанс! –

+0

Могу ли я сохранить действия в главном контроллере? –

+0

@AdamNovakovi Если вы имеете в виду определение 'onAction =" ... "' в текстовом поле, которое всегда разрешает метод в контроллере для этого фактического файла FMXL. Таким образом, действие текстового поля должно быть в контроллере «Макет», и это то, что будет требовать базовая инкапсуляция. Другими словами, если вы собираетесь «модулировать» FXML, вы модулируете FXML и контроллер вместе. –

Смежные вопросы