【问题标题】:FXML controller class too largeFXML 控制器类太大
【发布时间】:2013-06-29 22:14:41
【问题描述】:

所以我已经使用 JavaFX 练习了一段时间,虽然我很喜欢它,但我发现我的应用程序的大小正在增长——尤其是在我的 FXML 控制器的代码行数方面。

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

MyFXML.fxml

MyFXMLController.java

MyDataModel.java

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

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

只有几个组件(大约 10 个)我有一个控制器类文件,它大约 550 行长,其中大约 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) {
    }
}

【问题讨论】:

    标签: coding-style refactoring javafx fxml


    【解决方案1】:

    好吧,我认为您没有选择注入您需要的 fxml 字段。但是,如果您在一个控制器中进行了多次这样的注入,那么您可能应该对您的应用程序有一个更好的概念,通过让子控制器一起工作,而不是只在一个控制器中拥有所有东西。一个视图并不意味着一个控制器。您可以拥有一个视图和多个控制器,并拥有自己的视图

    【讨论】:

    • 忘记标记为正确。这实际上帮助了我。现在我只是在将数据从嵌套控制器传递到主控制器时遇到问题。
    猜你喜欢
    • 2023-03-19
    • 2013-12-25
    • 2013-03-04
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多