1

私はJavaFXをしばらく練習してきましたが、気に入っていますが、特にFXMLコントローラーのコードの行数に関して、アプリケーションのサイズが大きくなっていることに気付きました。

現在、アプリケーションの各シーンの典型的なパッケージは次のようになっています。

MyFXML.fxml

MyFXMLController.java

MyDataModel.java

たとえば、テキスト フィールド、コンボボックス、ラジオ ボタンから情報を取得するフォームがあります。ボタンが押されると、フォーム情報がデータベースに保存され、テーブルビューでもすぐに更新されます。

テーブルビューでは、表示されている情報の削除と更新も可能です。

わずかなコンポーネント (約 10) で、約 550 行の長さのコントローラー クラス ファイルがあり、そのうちの約 100 行がインジェクション (@FXML) とインポートと成長によって占められています。

私のアプリケーションには、理想的には、これらの異なる種類のフォームが複数あり、それぞれにコントローラーがあります。データベース クエリはすべて異なるため、まだ抽象化することはできません。また、通常、テーブルビューのイベント リスナーは、他のコンポーネントよりも javafx で長いコードを必要とします。

私がやっていることよりも、javafxでGUIを構築するためのより良いアプローチがあるように感じます.

単一責任の原則に関する他のスタックオーバーフローの回答を読みました。以下のコードがヒントである場合、私のアプリケーションは単純に新しいスタッフ メンバーを作成し、情報を更新できるようにします。私のクラスがファイルすぎるのか、それとも 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) {
    }
}
4

1 に答える 1

2

まあ、必要な fxml フィールドを注入する選択肢はないと思います。しかし、1 つのコントローラーだけにそのようなインジェクションが多数ある場合は、サブコントローラーを相互に連携させ、1 つのコントローラーだけにすべてを持たせるのではなく、アプリのより良い概念を作成する必要があります。1 つのビューが 1 つのコントローラーを意味するわけではありません。独自のビューを持つ1つのビューと複数のコントローラーを持つことができます

于 2013-06-29T22:34:29.417 に答える