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

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

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

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

Q&A

解決済

2回答

641閲覧

JavaFxでdoActionが出来ない

Techann

総合スコア14

JavaFX

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

1グッド

0クリップ

投稿2022/05/02 08:39

使用環境
window 10Home
eclipse: 2022-03 
jdk:bellsoft-jdk18.01+12
scenebuilder:JavaFX Scene Builder18.00

GUIの勉強で
実験的にscenebuilderで
Textfild(idはTF1)を入力し
ボタン(Bt1)を押せば
TextArea(TA1)に表示される

仕組みをscenebuilder作っていますが
Bt1にイベント機能を入れないで
起動する際は
イベント機能はないものの
設定したパーツは
画面に表示される。

しかしながら、Bt1にイベント機能を追加するとエラー表示されて動かなくなってしまいます。
どうすれば解決出来るのでしょうか

(Bt1のイベント機能の追加の追加
→・Bt1にonAction="♯onBt1Action"項目追加
<java script>

コード
</java script>の追加
)

・Main.java
package application;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.fxml.FXMLLoader;

public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root,400,400);
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);
}
}

Sample.xml

<?xml version="1.0" encoding="UTF-8"?> <?language javascript?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.TextArea?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.Pane?> <?import javafx.event.ActionEvent?> <BorderPane xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> <fx:script> function doAction(#onBt1Action){ var str=TF1.getText(); str="あなたは"+[str]+"と書いた"; TA1.setText(str); </fx:script> <stylesheets> <URL value="application.css"/> </stylesheets> <center> <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> <children> <TextField fx:id="TF1" layoutX="26.0" layoutY="29.0" /> <Button fx:id="Bt1" layoutX="26.0" layoutY="66.0" mnemonicParsing="false" onAction="#onBt1Action" text="あいさつ" /> <TextArea fx:id="TA1" layoutX="1.0" layoutY="116.0" prefHeight="86.0" prefWidth="200.0" /> </children> </Pane> </center> </BorderPane>

エラー内容

javafx.fxml.LoadException: Page language not specified.
/C:/Users/c1130/eclipse/ex/ex6/bin/application/Sample.fxml:18

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2703)
at javafx.fxml/javafx.fxml.FXMLLoader$ScriptElement.processCharacters(FXMLLoader.java:1653)
at javafx.fxml/javafx.fxml.FXMLLoader.processCharacters(FXMLLoader.java:2937)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2644)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3331)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3287)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3255)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3227)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3203)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3196)
at ex6/application.Main.start(Main.java:14)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:833)

ーーーーーーーーーーーー
その他

/C:/Users/c1130/eclipse/ex/ex6/bin/application/Sample.fxml:18
→</fx:script>

at ex6/application.Main.start(Main.java:14)
→BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml"));

コンパイル時の時に
<TextField fx:id="TF1" layoutX="26.0" layoutY="29.0" />
→警告マークがついている
<Button fx:id="Bt1" layoutX="26.0" layoutY="66.0" mnemonicParsing="false" onAction="#onBt1Action" text="あいさつ" />
→電球に×のマークがついている

<TextArea fx:id="TA1" layoutX="1.0" layoutY="116.0" prefHeight="86.0" prefWidth="200.0" /> →警告マークがついてる 参考にしたサイト http://libro.tuyano.com/index2?id=8356003 →上記の内容に大体に沿って考えていきました
TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Java15でJavaScript Engineが削除されたようです。
そのため<?language javascript?>があったとしても、読み込めずエラーになるようです。
javafx fxml: page language not specified - JavaScript seems not to be supported - Stack Overflow

JavaFXでJavaScriptを使うのはあまり一般的ではないと思うので、普通にコントローラーに書いたらどうでしょうか。
FXMLでアクションイベントを実装する(3/5):初心者のためのJavaFXプログラミング入門 - libro
FXMLでアクションイベントを実装する(4/5):初心者のためのJavaFXプログラミング入門 - libro


Java

1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.stage.Stage; 7 8import java.io.IOException; 9 10public class Main extends Application { 11 public static void main(String[] args) { launch(); } 12 13 @Override public void start(Stage stage) throws IOException { 14 var fxmlLoader = new FXMLLoader(Main.class.getResource("Sample.fxml")); 15 var scene = new Scene(fxmlLoader.load(), 400, 400); 16 stage.setScene(scene); 17 stage.show(); 18 } 19}

xml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.TextArea?> 5<?import javafx.scene.control.TextField?> 6<?import javafx.scene.layout.BorderPane?> 7<?import javafx.scene.layout.Pane?> 8 9<BorderPane stylesheets="@application.css" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1" 10 fx:controller="application.SampleController"> 11 <center> 12 <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 13 <TextField fx:id="TF1" layoutX="26.0" layoutY="29.0"/> 14 <Button fx:id="Bt1" layoutX="26.0" layoutY="66.0" mnemonicParsing="false" onAction="#onBt1Action" 15 text="あいさつ"/> 16 <TextArea fx:id="TA1" layoutX="1.0" layoutY="116.0" prefHeight="86.0" prefWidth="200.0"/> 17 </Pane> 18 </center> 19</BorderPane>

Java

1package application; 2 3import javafx.event.ActionEvent; 4import javafx.fxml.FXML; 5import javafx.scene.control.*; 6 7public class SampleController { 8 @FXML TextField TF1; 9 @FXML Button Bt1; 10 @FXML TextArea TA1; 11 12 @FXML protected void onBt1Action(ActionEvent e) { 13 var str = TF1.getText(); 14 str = "あなたは、「" + str + "」と書いた。"; 15 TA1.setText(str); 16 } 17}

投稿2022/05/02 10:36

編集2022/05/02 10:43
TN8001

総合スコア9321

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

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

0

理由のみならず解答例もありがとうございます。

投稿2022/05/02 16:38

Techann

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問