###前提・実現したいこと
JavaFXを使って画面遷移をさせたいのですが、やり方がよくわからないです。
###発生している問題・エラーメッセージ
java.lang.NullPointerException <略>
###該当のソースコード
Original.java
package fx; <略> /** * * @author takahara */ public class Original extends Application { private static Original instance; private Stage stage; private Stage stage2; @Override public void start(Stage primaryStage) throws Exception { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("hello.fxml")); Parent root = loader.load(); // fx:rootに紐付いたノードインスタンスが得られる HelloController controller = loader.getController(); // fx:controllerに紐付いたコントローラインスタンスが得られる primaryStage.setTitle("Hello"); // シーン生成 Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } instance = this; } public static void main(String[] args) { launch(args); } /** * Page1へ遷移する * @param labelText */ public void sendhelloController(String labelText) { stage.setTitle("Hello"); /*HelloController controller = new HelloController(); this.replaceSceneContent(controller);*/ } /** * シーンの変更 * @param controller */ private void replaceSceneContent(Parent controller) { Scene scene = stage.getScene(); if (scene == null) { scene = new Scene(controller); stage.setScene(scene); } else { stage.getScene().setRoot(controller); } } public void MainController() { //stage.setTitle("Page2"); try { FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); Parent root = loader.load(); HelloController controller = loader.getController(); stage2.setTitle("Hello"); // シーン生成 Scene scene = new Scene(root); stage2.setScene(scene); stage2.show(); } catch(Exception e) { e.printStackTrace(); } } public static Original getInstance() { return instance; } } ```HelloController.java
package fx;
<略>
public class HelloController extends AnchorPane{
@FXML private Button helloButton; @FXML private Label helloLabel; private int cnt; @FXML public void onHelloButtonClicked(ActionEvent event) { Original.getInstance().MainController(); } public void onClick(ActionEvent event) { }
}
<?xml version="1.0" encoding="UTF-8"?>hello.fxml
1
<略>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fx.HelloController"> <children> <Label fx:id="helloLabel" layoutX="156.0" layoutY="158.0" text="Hello World!!" textFill="#da0606"> <font> <Font size="55.0" /> </font> </Label> <Button fx:id="helloButton" layoutX="216.0" layoutY="72.0" mnemonicParsing="false" onAction="#onHelloButtonClicked" text="Button"> <font> <Font size="34.0" /> </font> </Button> </children> </AnchorPane> ```Main.fxml ``` <?xml version="1.0" encoding="UTF-8"?> <略> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fx.HelloController"> <children> <VBox layoutX="127.0" layoutY="35.0" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <children> <省略> </children> </GridPane> </children> </VBox> </children> </AnchorPane> ```###試したこと
https://teratail.com/questions/97665 こちらの質問や
https://qiita.com/mix/items/7c797eccad0a5e3a43c3
http://javafx-trick.appspot.com/article/110001/110009/80051.html これらのサイトを見ながらやったですが、JavaFX自体をイマイチ理解しておらず、
fxml上でcontrollerのIDを指定するやり方でやったほうがいいと記載されていたので、何とかそっちでやろうとしていますが丸2日奮闘しても対策方法が見つけることが出来ていません。
Controllerなどの引数のLabelTextとはコピペの名残で使用はしていません。
instanceも何に使っているのかわかってないです。
ゆくゆくは、postgresqlを使って会員サイトのようなものを作りたいのですが、javaプログラム上でcontrollerのIDを指定するのと、fxml上で指定するのどちらが良いかも教えていただけたら幸いです。
初めての質問なので欠けている項目などありましたら、ご指摘承りたく存じます。何卒よろしくお願いします
###補足情報(言語/FW/ツール等のバージョンなど)
java version "1.8.0_151"
eclipse:Version: Oxygen.1a Release (4.7.1a)
###追記
MainController.java
package fx; import <略> public class MainController extends AnchorPane implements Initializable{ @FXML private ChoiceBox<String> dropDown; @FXML private TextField textBox; @FXML private Button button; @Override public void initialize(URL location, ResourceBundle resources) { // 何もしない } public MainController() { } @FXML public void onClick(ActionEvent event) { // テキストボックスに文字列をセットする textBox.setText("ボタンを押しました。"); } }
MainConrollerへの切り替え Hellocontroller.java
package fx; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.AnchorPane; public class HelloController extends AnchorPane{ @FXML private Button helloButton; @FXML private Label helloLabel; private int cnt; @FXML public void onHelloButtonClicked(ActionEvent event) throws IOException { /*this.helloLabel.setText("clicked! : " + cnt); cnt++;*/ Original.getInstance().MainController(); } public void onClick(ActionEvent event) { /*this.helloLabel.setText("clicked! : " + cnt); cnt++;*/ //Original.getInstance().MainController(); } }
Original.java
package fx; import java.io.IOException; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Original extends Application { private static Original instance; private Stage stage; @Override public void start(Stage primaryStage) throws Exception { // インスタンス instance = this; try { FXMLLoader loader = new FXMLLoader(getClass().getResource("hello.fxml")); Parent root = loader.load(); // fx:rootに紐付いたノードインスタンスが得られる stage = primaryStage; // タイトルセット primaryStage.setTitle("Hello"); // シーン生成 Scene scene = new Scene(root); //scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } public void sendhelloController(String labelText) { stage.setTitle("Hello"); HelloController controller = new HelloController(); this.replaceSceneContent(controller); } private void replaceSceneContent(Parent controller) { Scene scene = stage.getScene(); if (scene == null) { scene = new Scene(controller); stage.setScene(scene);//このステージで使用されるシーンを指定 System.out.println("a");//確認用文字出力 } else { stage.getScene().setRoot(controller); } } public void MainController() throws IOException { stage.setTitle("Main"); FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); Parent root = loader.load(); // fx:rootに紐付いたノードインスタンスが得られる MainController controller = loader.getController(); // fx:controllerに紐付いたコントローラインスタンスが得られる this.replaceSceneContent(controller); } public static Original getInstance() { return instance; } }
Main.fxml
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.text.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.collections.FXCollections ?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fx.MainController"> <略> </AnchorPane>
回答1件
あなたの回答
tips
プレビュー