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

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

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

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

Java

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

Q&A

解決済

1回答

3027閲覧

JavaFXの質問 screenBuilderでパネルを再構成したら例外がでるようになった

mike2mike4

総合スコア894

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/02/18 01:10

JavaFXの質問です。一度プログラムを作成して上手く実行できました。
で、レイアウトに不満が出てきてscreenBuilderで一から作り直したのですが
例外、javafx.fxml.LoadException:Root hasn't been set.Use method setRoot() before load.
というのが出ます。どこかでsetRootメソッドを使えばいいのでしょうか?

java(SampleController.java)

1 2import java.io.BufferedReader; 3import java.io.BufferedWriter; 4import java.io.File; 5import java.io.FileReader; 6import java.io.FileWriter; 7import java.io.PrintWriter; 8import java.io.StringWriter; 9import java.net.URL; 10import java.util.ResourceBundle; 11 12import javafx.event.EventHandler; 13import javafx.fxml.FXML; 14import javafx.fxml.Initializable; 15import javafx.scene.control.Alert; 16import javafx.scene.control.Alert.AlertType; 17import javafx.scene.control.TextArea; 18import javafx.scene.input.KeyCode; 19import javafx.scene.input.KeyEvent; 20 21public class SampleController implements Initializable{ 22 @FXML 23 private TextArea txtArea; 24 25 26 @Override 27 public void initialize(URL location, ResourceBundle resources) { 28 try { 29 File file = new File("C:\\Users\\mscat\\tmpData.dat"); 30 if (!file.exists()) {//ファイルがなかった場合 31 file.createNewFile(); 32 Alert alert = new Alert(AlertType.INFORMATION); 33 alert.setTitle("Information Dialog"); 34 alert.setHeaderText("ファイルが無かったので作りました"); 35 alert.setContentText(null); 36 alert.show(); 37 } else {//ファイルがあった場合 38 FileReader filereader = new FileReader(file); 39 BufferedReader br = new BufferedReader(filereader); 40 String str = br.readLine(); 41 42 while(str != null){//ファイルを末尾まで読む 43 txtArea.appendText(str); 44 str = br.readLine(); 45 txtArea.appendText("\n"); 46 } 47 48 br.close(); 49 50 51 } 52 53 } catch (Exception e) { 54 // エラーのスタックトレースを表示 55 StringWriter sw = new StringWriter(); 56 PrintWriter pw = new PrintWriter(sw); 57 e.printStackTrace(pw); 58 pw.flush(); 59 String str = sw.toString(); 60 //例外メッセージボックスを表示 61 Alert alert = new Alert(AlertType.INFORMATION); 62 alert.setTitle("Information Dialog"); 63 alert.setHeaderText("例外発生!"+ str); 64 alert.setContentText(null); 65 alert.show(); 66 67 } 68 69 } 70 @FXML 71 void KeyPressed(){// 押下処理を追加する 72 txtArea.setOnKeyPressed(new EventHandler<KeyEvent>() { 73 74 @Override 75 public void handle(KeyEvent event) { 76 if (event.getCode() == KeyCode.ENTER) { 77 File file = new File("C:\\Users\\mscat\\tmpData.dat"); 78 FileWriter filewriter; 79 try {//Enterキーを押されたらファイルに書き込む 80 filewriter = new FileWriter(file); 81 BufferedWriter br = new BufferedWriter(filewriter); 82 83 br.write(txtArea.getText()); 84 85 br.close(); 86 87 } catch (Exception e) { 88 // エラーのスタックトレースを表示 89 StringWriter sw = new StringWriter(); 90 PrintWriter pw = new PrintWriter(sw); 91 e.printStackTrace(pw); 92 pw.flush(); 93 String str = sw.toString(); 94 //例外メッセージボックスを表示 95 Alert alert = new Alert(AlertType.INFORMATION); 96 alert.setTitle("Information Dialog"); 97 alert.setHeaderText("例外発生!"+ str); 98 alert.setContentText(null); 99 alert.show(); 100 101 } 102 103 } 104 105 } 106 }); 107 } 108 109} 110

Fxml(Sample.fxml)

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.*?> 4<?import java.lang.*?> 5<?import javafx.scene.layout.*?> 6 7<BorderPane 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="application.SampleController"> 8 <top> 9 <MenuBar BorderPane.alignment="CENTER"> 10 <menus> 11 <Menu mnemonicParsing="false" text="File"> 12 <items> 13 <MenuItem mnemonicParsing="false" text="Close" /> 14 </items> 15 </Menu> 16 <Menu mnemonicParsing="false" text="Edit"> 17 <items> 18 <MenuItem mnemonicParsing="false" text="Delete" /> 19 </items> 20 </Menu> 21 <Menu mnemonicParsing="false" text="Help"> 22 <items> 23 <MenuItem mnemonicParsing="false" text="About" /> 24 </items> 25 </Menu> 26 </menus> 27 </MenuBar> 28 </top> 29 <center> 30 <TextArea fx:id="txtArea" onKeyPressed="#KeyPressed" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" /> 31 </center> 32</BorderPane> 33

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

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

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

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

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

guest

回答1

0

ベストアンサー

どこかでsetRootメソッドを使えばいいのでしょうか?

setRootはFXMLLoaderのメソッドで、典型的にはカスタムコントロールをロードする際に使うと思います。拝見した限り質問者さんの意図はそこにはないようですのでロードの仕方の方に問題があると思います。FXMLをロードする部分のコードはどのようになっているでしょう?

例えばご質問にあるコントローラーとFXMLは以下のようにロードできました。ただし次の仮定を置いています。

  • FXMLファイル

Sample.fxmlという名前でapplicationパッケージに置かれていると仮定してます

  • SampleControllerのpackage

ソース上には書かれていませんがapplicationパッケージに存在すると仮定します。というのはFXML上のコントローラークラス名がそうなっているからです。もしapplicationパッケージにコントローラークラスを定義していなかったとしたらそれは一つの問題ですが、それだけではご質問のエラーにはなりませんでした。

java

1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Parent; 6import javafx.scene.Scene; 7import javafx.stage.Stage; 8 9public class SampleMain extends Application { 10 @Override 11 public void start(Stage stage) throws Exception { 12 Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml")); 13 stage.setScene(new Scene(root)); 14 stage.show(); 15 } 16} 17

投稿2017/02/18 03:53

KSwordOfHaste

総合スコア18394

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

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

mike2mike4

2017/02/18 04:14

回答ありがとうございます。Mainクラスのコードを書かれたとおり試行錯誤で試してみたらうまく実行できました。FXMLLoaderを理解しないまま、コピペで実行していたのが悪かったようです。てっきりControllerクラスに問題があると思い込んでました。感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問