FXML控制器类太大了

时间:2013-06-29 22:14:42

标签: coding-style refactoring javafx fxml

所以我一直在用JavaFX练习一段时间,虽然我喜欢它,但我发现我的应用程序的大小正在增长 - 特别是在我的FXML控制器的代码行数方面。

现在,我的应用程序中每个场景的典型包如下所示:

MyFXML.fxml

MyFXMLController.java

MyDataModel.java

例如,我有一个表单,它从文本字段,组合框和单选按钮中获取一些信息。按下按钮时,表单信息将保存到数据库中,并在表格视图中立即更新。

tableview还允许删除和更新显示的信息。

只有少数几个组件(大约10个)我有一个大约550行的Controller类文件,大约有100个被注入(@FXML)占用并导入和增长!

我的应用程序理想情况下会有多种不同类型的表单和每种表单的控制器。数据库查询都是不同的,所以它不能引用它们来抽象它们。此外,tableview的事件监听器通常在javafx中需要比其他组件更长的代码。

我觉得在javafx中构建GUI的方法比我正在做的更好,并且想知道是否有某种类型的引用可以查找?

我已经阅读了有关单一责任原则的其他stackoverflow答案。如果下面的代码是任何提示,我的应用程序只需创建一个新的工作人员并允许更新信息。所以我很困惑我的课程是否过于文件或GUI编程是否正常?

我没有要求编码帮助,我正在寻找有关如何在javafx中改进GUI编程的建议。

谢谢!

-

FWIW,这是示例控制器文件的样子

package myApp.staff;

//30 something lines of imports...

public class NewStaffMemberController implements Initializable {

    //80 something lines of private variables and @FXML injections

    public void setConn(Connection aConn) {
        conn = aConn;

        wrapGenderRadioButtons();

        populateDates();

        populateStaffTypeComboBox();

        populateDepartmentComboBox();

        populateStaffTable();
    }

    private void wrapGenderRadioButtons() {
        //4 lines
    }

    private void populateDates() {
        //25 lines
    }

    private void populateStaffTypeComboBox() {
        //20 lines
    }

    private void populateDepartmentComboBox() {
        //22 lines
    }

    private void populateStaffTable(){
        //longest at 100 lines. This code also adds the event listener for the tableview- makes it quite long!
    }

    private void editSelectedTableRow(Staff selectedstaff){
        //4 lines
    }

    @FXML
    private void selectedRadioBtnAction() {
        //1 lines
    }

    @FXML
    private void handleYearComboBoxAction() {
        //1 lines
    }

    @FXML
    private void handleMonthComboBoxAction() {
        //1 lines
    }

    @FXML
    private void handleDayComboBoxAction() {
        //1 lines
    }

    @FXML
    private void staffTypeComboBoxAction() {
        //1 lines
    }

    @FXML
    private void departmentComboBoxAction() {
        //1 lines
    }

    @FXML
    private void btnGenerateStaffId() {
        //36 lines
    }

    @FXML
    private void btnSaveInformation(){
        13 lines
    }

    private Boolean validateData() {

        //43 lines
    }

    private void assignStaffId() {
        //12 lines

    }

    private void insertIntoDatabase() {
        //35 lines
    }

    private void updateDatabase(){
       //35 lines
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    }
}

1 个答案:

答案 0 :(得分:2)

好吧,我认为你没有选择注入你需要的fxml字段。但也许如果您只在一个控制器中进行多次注射,您应该对应用程序进行更好的构思,方法是让子控制器彼此协同工作,而不是仅仅在一个控制器中。一个视图并不意味着一个控制器。您可以拥有一个视图和多个具有自己视图的控制器