JavaFXの質問 screenBuilderでパネルを再構成したら例外がでるようになった
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,073
JavaFXの質問です。一度プログラムを作成して上手く実行できました。
で、レイアウトに不満が出てきてscreenBuilderで一から作り直したのですが
例外、javafx.fxml.LoadException:Root hasn't been set.Use method setRoot() before load.
というのが出ます。どこかでsetRootメソッドを使えばいいのでしょうか?
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
public class SampleController implements Initializable{
@FXML
private TextArea txtArea;
@Override
public void initialize(URL location, ResourceBundle resources) {
try {
File file = new File("C:\\Users\\mscat\\tmpData.dat");
if (!file.exists()) {//ファイルがなかった場合
file.createNewFile();
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information Dialog");
alert.setHeaderText("ファイルが無かったので作りました");
alert.setContentText(null);
alert.show();
} else {//ファイルがあった場合
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
String str = br.readLine();
while(str != null){//ファイルを末尾まで読む
txtArea.appendText(str);
str = br.readLine();
txtArea.appendText("\n");
}
br.close();
}
} catch (Exception e) {
// エラーのスタックトレースを表示
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
String str = sw.toString();
//例外メッセージボックスを表示
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information Dialog");
alert.setHeaderText("例外発生!"+ str);
alert.setContentText(null);
alert.show();
}
}
@FXML
void KeyPressed(){// 押下処理を追加する
txtArea.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.ENTER) {
File file = new File("C:\\Users\\mscat\\tmpData.dat");
FileWriter filewriter;
try {//Enterキーを押されたらファイルに書き込む
filewriter = new FileWriter(file);
BufferedWriter br = new BufferedWriter(filewriter);
br.write(txtArea.getText());
br.close();
} catch (Exception e) {
// エラーのスタックトレースを表示
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
String str = sw.toString();
//例外メッセージボックスを表示
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information Dialog");
alert.setHeaderText("例外発生!"+ str);
alert.setContentText(null);
alert.show();
}
}
}
});
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<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">
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</top>
<center>
<TextArea fx:id="txtArea" onKeyPressed="#KeyPressed" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
どこかでsetRootメソッドを使えばいいのでしょうか?
setRootはFXMLLoaderのメソッドで、典型的にはカスタムコントロールをロードする際に使うと思います。拝見した限り質問者さんの意図はそこにはないようですのでロードの仕方の方に問題があると思います。FXMLをロードする部分のコードはどのようになっているでしょう?
例えばご質問にあるコントローラーとFXMLは以下のようにロードできました。ただし次の仮定を置いています。
- FXMLファイル
Sample.fxmlという名前でapplicationパッケージに置かれていると仮定してます - SampleControllerのpackage
ソース上には書かれていませんがapplicationパッケージに存在すると仮定します。というのはFXML上のコントローラークラス名がそうなっているからです。もしapplicationパッケージにコントローラークラスを定義していなかったとしたらそれは一つの問題ですが、それだけではご質問のエラーにはなりませんでした。
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class SampleMain extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
stage.setScene(new Scene(root));
stage.show();
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/18 13:14