質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

510閲覧

JavaFXでのページ遷移

antelope

総合スコア2

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/12/29 07:12

編集2022/12/30 08:30

前提

java・javaFXの初学者です。
稚拙な質問ですが何卒ご容赦ください。
スクリーンショットの画面をアプリケーションのホーム画面だとします。

実現したいこと

左のAssetsボタンをクリックした時、新しいウィンドウではなくMain Paneと書かれているペイン上に
Assetsに相当するページが開かれるようにするにはどのようにすればよいでしょうか?

スクリーンショット

イメージ説明

ソースコード

HelloController.java

1package com.example.demo12; 2 3import java.net.URL; 4import java.util.ResourceBundle; 5import javafx.event.ActionEvent; 6import javafx.fxml.FXML; 7import javafx.scene.layout.AnchorPane; 8 9public class HelloController { 10 11 @FXML 12 private ResourceBundle resources; 13 14 @FXML 15 private URL location; 16 17 @FXML 18 private AnchorPane mainPane; 19 20 @FXML 21 protected void onClickHome(ActionEvent evt) { 22 System.out.println("Clicked"); 23 } 24 25 @FXML 26 void initialize() { 27 assert mainPane != null : "fx:id=\"mainPane\" was not injected: check your FXML file 'HelloView.fxml'."; 28 29 } 30}

HelloApplication.java

1package com.example.demo12; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5 6import javafx.scene.Scene; 7import javafx.stage.Stage; 8 9import java.io.IOException; 10 11public class HelloApplication extends Application { 12 @Override 13 public void start(Stage stage) throws IOException { 14 FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("HelloView.fxml")); 15 Scene scene = new Scene(fxmlLoader.load(), 320, 240); 16 stage.setTitle("Hello!"); 17 stage.setScene(scene); 18 stage.show(); 19 } 20 21 public static void main(String[] args) { 22 launch(); 23 } 24}

HelloView.fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.geometry.*?> 4<?import javafx.scene.control.*?> 5<?import javafx.scene.layout.*?> 6<?import javafx.scene.text.*?> 7 8<SplitPane dividerPositions="0.29797979797979796" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.demo12.HelloController"> 9 <items> 10 <AnchorPane maxWidth="-Infinity" minHeight="0.0" minWidth="0.0" prefHeight="300.0" prefWidth="100.0"> 11 <children> 12 <VBox prefHeight="400.0" prefWidth="100.0"> 13 <children> 14 <Button mnemonicParsing="false" onAction="#onClickHome" prefWidth="100.0" text="Home"> 15 <VBox.margin> 16 <Insets top="50.0" /> 17 </VBox.margin> 18 <font> 19 <Font size="14.0" /> 20 </font> 21 </Button> 22 <Button mnemonicParsing="false" prefHeight="35.0" prefWidth="104.0" text="Assets"> 23 <VBox.margin> 24 <Insets top="10.0" /> 25 </VBox.margin> 26 <font> 27 <Font size="14.0" /> 28 </font> 29 </Button> 30 </children> 31 </VBox> 32 </children></AnchorPane> 33 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"> 34 <children> 35 <SplitPane dividerPositions="0.1407035175879397" orientation="VERTICAL" prefHeight="400.0" prefWidth="500.0"> 36 <items> 37 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 38 <children> 39 <Label text="Utils"> 40 <font> 41 <Font size="22.0" /> 42 </font> 43 <padding> 44 <Insets left="10.0" top="5.0" /> 45 </padding> 46 </Label> 47 </children> 48 </AnchorPane> 49 <AnchorPane fx:id="mainPane" minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 50 <children> 51 <Label layoutX="113.0" layoutY="104.0" prefHeight="81.0" prefWidth="240.0" text="Main Pane"> 52 <font> 53 <Font size="24.0" /> 54 </font> 55 <padding> 56 <Insets left="100.0" top="150.0" /> 57 </padding> 58 </Label> 59 </children> 60 </AnchorPane> 61 </items> 62 </SplitPane> 63 </children></AnchorPane> 64 </items> 65</SplitPane>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. Assetsボタンにidをつける。たとえば assetsButton

diff

1diff HelloView.fxml 2- <Button mnemonicParsing="false" prefHeight="35.0" prefWidth="104.0" text="Assets"> 3+ <Button fx:id="assetsButton" mnemonicParsing="false" prefHeight="35.0" prefWidth="104.0" text="Assets">
  1. HelloControllerにButtonを定義し、イベントハンドラを書く。

diff

1HelloController.java 2 @FXML 3 private AnchorPane mainPane; 4 5+ @FXML 6+ private Button assetsButton; 7+ 8 @FXML 9 protected void onClickHome(ActionEvent evt) { 10 System.out.println("Clicked"); 11 12 void initialize() { 13 assert mainPane != null : "fx:id=\"mainPane\" was not injected: check your FXML file 'HelloView.fxml'."; 14 15+ assetsButton.setOnAction(ev -> { 16+ mainPane.getChildren().clear(); 17+ mainPane.getChildren().add(new Label(LocalDateTime.now().toString())); 18+ }); 19 } 20 }

mainPaneに表示したい項目が複雑なのであれば、別途fxmlファイルと対応するContollerクラスを定義し、HelloView.fxmlファイルと同様にloadして、mainPaneに追加すればいい。


手を尽くしたのですがAssetsページに別fxmlを利用するとどうしても別ウィンドウで開かれてしまい思ったように動作しません

diff

1HelloController.java 2 import javafx.fxml.FXML; 3+import javafx.fxml.FXMLLoader; 4 import javafx.scene.layout.AnchorPane; 5 6 public class HelloController { 7@@ -20,14 +24,28 @@ 8 @FXML 9 private AnchorPane mainPane; 10 11+ @FXML 12+ private Button assetsButton; 13+ 14 @FXML 15 protected void onClickHome(ActionEvent evt) { 16 System.out.println("Clicked"); 17 } 18 19 @FXML 20- void initialize() { 21+ void initialize() throws Exception { 22 assert mainPane != null : "fx:id=\"mainPane\" was not injected: check your FXML file 'HelloView.fxml'."; 23 24+ final AnchorPane subPanel = FXMLLoader.load(this.getClass().getResource("./SubPanel.fxml")); 25+ AnchorPane.setTopAnchor(subPanel, 0.); 26+ AnchorPane.setBottomAnchor(subPanel, 0.); 27+ AnchorPane.setLeftAnchor(subPanel, 0.); 28+ AnchorPane.setRightAnchor(subPanel, 0.); 29+ 30+ assetsButton.setOnAction(ev -> { 31+ mainPane.getChildren().clear(); 32+// mainPane.getChildren().add(new Label(LocalDateTime.now().toString())); 33+ mainPane.getChildren().add(subPanel); 34+ }); 35 } 36 }

diff

1SubPanel.fxml 2+<?xml version="1.0" encoding="UTF-8"?> 3+ 4+<?import javafx.scene.control.Button?> 5+<?import javafx.scene.control.Label?> 6+<?import javafx.scene.control.TextArea?> 7+<?import javafx.scene.layout.AnchorPane?> 8+<?import javafx.scene.layout.ColumnConstraints?> 9+<?import javafx.scene.layout.GridPane?> 10+<?import javafx.scene.layout.HBox?> 11+<?import javafx.scene.layout.RowConstraints?> 12+ 13+ 14+<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="278.0" prefWidth="344.0" xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1"> 15+ <children> 16+ <GridPane layoutX="14.0" layoutY="90.0" prefHeight="278.0" prefWidth="344.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 17+ <columnConstraints> 18+ <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 19+ <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 20+ </columnConstraints> 21+ <rowConstraints> 22+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 23+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 24+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 25+ </rowConstraints> 26+ <children> 27+ <HBox alignment="CENTER_RIGHT" GridPane.columnSpan="2147483647" GridPane.rowIndex="2"> 28+ <children> 29+ <Button mnemonicParsing="false" text="Button" /> 30+ <Button mnemonicParsing="false" text="Button" /> 31+ <Button mnemonicParsing="false" text="Button" /> 32+ </children> 33+ </HBox> 34+ <TextArea prefHeight="200.0" prefWidth="200.0" GridPane.columnSpan="2147483647" GridPane.rowIndex="1" /> 35+ <Label text="Label" /> 36+ </children> 37+ </GridPane> 38+ </children> 39+</AnchorPane>

投稿2022/12/29 07:55

編集2022/12/29 11:04
shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

antelope

2022/12/29 09:40 編集

おかげ様で同一fxml内でのmainPane上の記述と動作に成功しました。ありがとうございます。 そこで新たに別fxmlファイルと対応するControllerクラスを定義する場合は assetsButton.setOnAction(ev -> {}内にてload処理を行えばよいでしょうか? >mainPaneに追加すればいい 申し訳ございませんがこちらについて補足願えますでしょうか 手を尽くしたのですがAssetsページに別fxmlを利用するとどうしても別ウィンドウで開かれてしまい思ったように動作しません
antelope

2022/12/29 23:30

ご丁寧にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問