簡體   English   中英

如何在javafx中分隔我的GUI?

[英]How to separate my gui in javafx?

通常,當我創建GUI時,我會使用swing並創建自己的擴展jframe的類。 然后,我創建一個控制器類並將程序基於mvc設計。 但是我決定最近嘗試使用javafx,我有點迷茫。

目前,我只是在start方法上將所有gui放在我的主類中,其中所有使用過的和引用的對象都在我的主類中聲明為字段。 這看起來很凌亂,沒有正確實現。 無論如何,有沒有用javafx做我以前使用swing的事情?

  • 我寧願不使用fxml,也不打算對其進行計划。

通常,您有一個主類,它可以啟動GUI。 您的MVC的“視圖”部分由XML文件(稱為FXML)處理。 該FXML連接到控制器類。 JavaFX還允許您將所有GUI組件直接注入到控制器內部的適當變量中,因此您無需查找它們。 獲得示例項目的最簡單方法是使用JavaFX的Maven原型

mvn archetype:generate -DarchetypeGroupId=com.zenjava -DarchetypeArtifactId=javafx-basic-archetype

只需轉到您要在其中輸入上述命令的目錄即可。 然后直接為您生成示例項目。 因此,讓我們從主要課程開始

public class MainApp extends Application {

    private static final Logger log = LoggerFactory.getLogger(MainApp.class);

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

    public void start(Stage stage) throws Exception {

        log.info("Starting Hello JavaFX and Maven demonstration application");

        String fxmlFile = "/fxml/hello.fxml";
        log.debug("Loading FXML for main view from: {}", fxmlFile);
        FXMLLoader loader = new FXMLLoader();
        Parent rootNode = (Parent) loader.load(getClass().getResourceAsStream(fxmlFile));

        log.debug("Showing JFX scene");
        Scene scene = new Scene(rootNode, 400, 200);
        scene.getStylesheets().add("/styles/styles.css");

        stage.setTitle("Hello JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }
}

如您所見,它僅加載FXM1並顯示主窗口。 FXML指定GUI的視覺結構(標簽,文本字段,圖像,按鈕滾動條等)

<MigPane id="rootPane" fx:controller="example.HelloController" styleClass="main-panel" layout="insets 20" cols="[label, pref!][grow, 50::]" rows="" xmlns:fx="http://javafx.com/fxml">
    <Label text="First Name:" />
    <TextField fx:id="firstNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
    <Label text="Last Name:" /> <TextField fx:id="lastNameField" prefColumnCount="30" MigPane.cc="growx, wrap" />
    <Button text="Say Hello" onAction="#sayHello" MigPane.cc="skip, gap :push, gaptop 15, wrap" />
    <Label fx:id="messageLabel" styleClass="hello-message" MigPane.cc="span, growx, gaptop 15" />
</MigPane >

在FXML中指定了用於將GUI與邏輯分離的Controller,而fx:id用於將元素直接注入到控制器內部的適當變量中

public class HelloController
{
    private static final Logger log = LoggerFactory.getLogger(HelloController.class);

    @FXML private TextField firstNameField;
    @FXML private TextField lastNameField;
    @FXML private Label messageLabel;

    public void sayHello() {

        String firstName = firstNameField.getText();
        String lastName = lastNameField.getText();

        StringBuilder builder = new StringBuilder();

        if (!StringUtils.isEmpty(firstName)) {
            builder.append(firstName);
        }

        if (!StringUtils.isEmpty(lastName)) {
            if (builder.length() > 0) {
                builder.append(" ");
            }
            builder.append(lastName);
        }

        if (builder.length() > 0) {
            String name = builder.toString();
            log.debug("Saying hello to " + name);
            messageLabel.setText("Hello " + name);
        } else {
            log.debug("Neither first name nor last name was set, saying hello to anonymous person");
            messageLabel.setText("Hello mysterious person");
        }
    }

}

控制器具有帶有@FXML批注的字段,這些字段是注入的GUI元素。 您可以使變量名等於fx:id這對於JavaFX注入元素是必需的。 要創建FXML,您可以使用Oracle Scene BuilderGluon的on都非常易於使用,並且可以快速生成美觀的GUI。

解決方案:創建一個擴展場景的類,該場景將舞台作為參數。 將所有主要內容移入開始。 允許定期擺動MVC設計。

public class Main extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {       

        CardModel model = new CardModel();
        CardView scene = new CardView(stage);       
        CardController controller= new CardController(model,scene);

        stage.setTitle("Title");
        stage.setMaximized(true);
        stage.setMinWidth(500);
        stage.setMinHeight(550);
        stage.setScene(scene);
        stage.show();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM