[英]Switch scenes from FXML to pure JavaFX UI class
我是 JavaFX 的新手。我已經學會了如何在 FXML 文件或僅用 JavaFX 純編碼的類之間切換場景。 我現在最大的挑戰是在 FXML UI 和另一個內置 JavaFX 之間切換,反之亦然,所以我知道這是可能的,但我就是做不好。 我的應用程序 controller 的代碼是:
package com.example.fxmltojavafx;
import com.sun.javafx.stage.EmbeddedWindow;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import java.net.URL;
import java.util.ResourceBundle;
public class HelloController extends Application {
@FXML
private Label welcomeText;
@FXML
private Button bt_switch;
@FXML
protected void onHelloButtonClick() {
//switch scene method from fxml to pure javafx
//bt_switch.setOnAction(e -> window.setScene(InterfaceSwitch));
welcomeText.setText("Welcome to JavaFX Application!");
}
@Override
public void start(Stage stage) throws Exception {
bt_switch.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
bt_switch.setOnAction(e -> window.setScene(InterfaceSwitch));
}
});
}
}
我如何引用 JavaFX class 我想通過單擊 fxml 按鈕加載? 我嘗試了 window.setScene(),但它並沒有讓我的參考正確。 當然我不能使用 FMXMLLoader.load()。
我要從這個按鈕加載的場景編碼在這個class中:(編碼到里面的按鈕只是一個測試)
package com.example.fxmltojavafx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/***
* Intefaccia puramente in JavaFX
*/
public class InterfaceSwitch extends Application {
private Stage stage;
@Override
public void start(Stage stageInterface) throws Exception {
VBox parent = new VBox();
parent.getChildren().add(new Label("SERVER DOMINATOR : Inserisci dati"));
//setup process
HBox username = new HBox(new Label("username :")); //username field
TextField usernametext = new TextField();
username.getChildren().add(usernametext);
parent.getChildren().add(username);
HBox password = new HBox(new Label("password :")); //password field
TextField passwordtext = new TextField();
password.getChildren().add(passwordtext);
parent.getChildren().add(password);
HBox port = new HBox(new Label("port :")); //port field
TextField porttext = new TextField();
port.getChildren().add(porttext);
parent.getChildren().add(port);
HBox signupQuest = new HBox(new Label("Set up my game!"));
parent.getChildren().add(signupQuest);
Button button1 = new Button("Set up");
parent.getChildren().add(button1);
//Scene scene = new Scene(new Label("Server Dominator : Set up"));
stage.setScene(new Scene(parent));
stage.show();
}
}
我的 FXML UI 基本上只有 2 個按鈕,一個用於“hello world”,另一個是 bt_switch
我的總機 class:
package com.example.fxmltojavafx;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
這一定是一個簡單的設置問題,但我無法理解它。 我該怎么做?
Application
class 代表整個應用程序,特別是它的生命周期。 它的目的是通過start()
、 init()
和stop()
等方法管理應用程序的啟動和關閉。 因此,每個應用程序應該只有一個Application
子類,並且應該只有一個它的實例(在應用程序啟動時為您創建)。
在您發布的代碼中, HelloApplication
代表應用程序生命周期。 HelloController
只是一個 controller,不應該是Application
的子類。 InterfaceSwitch
也不代表應用程序(它只代表一個 UI),因此它不應該是Application
的子類。
你應該有類似的東西
public class SomeUI {
private VBox root ;
public SomeUI() {
root = new VBox();
root.getChildren().add(new Label("SERVER DOMINATOR : Inserisci dati"));
//setup process
HBox username = new HBox(new Label("username :")); //username field
TextField usernametext = new TextField();
username.getChildren().add(usernametext);
root.getChildren().add(username);
HBox password = new HBox(new Label("password :")); //password field
TextField passwordtext = new TextField();
password.getChildren().add(passwordtext);
root.getChildren().add(password);
HBox port = new HBox(new Label("port :")); //port field
TextField porttext = new TextField();
port.getChildren().add(porttext);
root.getChildren().add(port);
HBox signupQuest = new HBox(new Label("Set up my game!"));
root.getChildren().add(signupQuest);
Button button1 = new Button("Set up");
root.getChildren().add(button1);
}
public Parent getRoot() {
return root ;
}
}
由於您說您的 controller 是具有兩個按鈕的 FXML 文件的 controller,因此它需要兩個事件處理程序方法(每個按鈕一個)。 切換場景的按鈕的處理程序只是以正常方式執行此操作。 顯然, controller 不應該是一個Application
。
public class HelloController {
@FXML
private Label welcomeText;
@FXML
protected void onHelloButtonClick() {
welcomeText.setText("Welcome to JavaFX Application!");
}
@FXML
protected void switchScenes() {
SomeUI newScene = new SomeUI();
Parent root = newScene.getRoot();
welcomeText.getScene().setRoot(root);
}
}
FXML 看起來像:
<VBox spacing="10" xmlns = "http://javafx.com/javafx/16" xmlns:fx = "http://javafx.com/fxml/1" fx:controller="com.example.HelloController">
<Label fx:id="welcomeText" />
<Button text="Say Hello" onAction="#onHelloButtonClick"/>
<Button text="Switch scenes" onAction="#switchScenes" />
</VBox>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.