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

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

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

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

Java

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

Q&A

解決済

1回答

5397閲覧

JavaFXのTextAreaでsetTextがエラーになる

mike2mike4

総合スコア901

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/02/14 14:24

JavaFXの質問です。ファイルから文字列を読み込んでTextAreaに表示させようとしているのですが、以下のコードでsetTextで設定しようとするとNullPointerExceptionが出ます。初期設定がまずいかと思われますがJavaFXはよくわかりません。なお、以下のコードでは読み込んだファイルの文字列は無視し、「USA!」という文字列を出力するようにしています。
よろしくお願いします。

java

1package application; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileReader; 6import java.io.PrintWriter; 7import java.io.StringWriter; 8 9import javafx.application.Application; 10import javafx.fxml.FXML; 11import javafx.fxml.FXMLLoader; 12import javafx.scene.Scene; 13import javafx.scene.control.Alert; 14import javafx.scene.control.Alert.AlertType; 15import javafx.scene.control.TextArea; 16import javafx.scene.layout.BorderPane; 17import javafx.stage.Stage; 18 19 20public class Main extends Application { 21 @FXML 22 private TextArea txtA; 23 24 @Override 25 26 public void start(Stage primaryStage) { 27 try { 28 BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Sample.fxml")); 29 Scene scene = new Scene(root,400,400); 30 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 31 primaryStage.setScene(scene); 32 primaryStage.show(); 33 34 35 36 File file = new File("C:\\Users\\mscat\\tmpData.dat"); 37 if (!file.exists()) { 38 file.createNewFile(); 39 Alert alert = new Alert(AlertType.INFORMATION); 40 alert.setTitle("Information Dialog"); 41 alert.setHeaderText("ファイルが無かったので作りました"); 42 alert.setContentText(null); 43 alert.show(); 44 } else { 45 FileReader filereader = new FileReader(file); 46 BufferedReader br = new BufferedReader(filereader); 47 String str = br.readLine(); 48 49 while(str != null){ 50 txtA.setText("USA!"); 51// tx.setText(str); 52 str = br.readLine(); 53 } 54 55 br.close(); 56 57 58 } 59 60 61 } catch (Exception e) { 62 // エラーのスタックトレースを表示 63 StringWriter sw = new StringWriter(); 64 PrintWriter pw = new PrintWriter(sw); 65 e.printStackTrace(pw); 66 pw.flush(); 67 String str = sw.toString(); 68 69 Alert alert = new Alert(AlertType.INFORMATION); 70 alert.setTitle("Information Dialog"); 71 alert.setHeaderText("例外発生!"+ str); 72 alert.setContentText(null); 73 alert.show(); 74 75 } 76 } 77 78 public static void main(String[] args) { 79 launch(args); 80 } 81} 82 83Sample.fxmlは 84<?xml version="1.0" encoding="UTF-8"?> 85 86<?import javafx.scene.text.*?> 87<?import javafx.scene.control.*?> 88<?import java.lang.*?> 89<?import javafx.scene.layout.*?> 90<?import javafx.scene.layout.BorderPane?> 91 92<BorderPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> 93 <center> 94 <Pane prefHeight="400.0" prefWidth="600.0" BorderPane.alignment="TOP_LEFT"> 95 <children> 96 <TextArea layoutY="48.0" prefHeight="352.0" prefWidth="600.0"> 97 <font> 98 <Font size="14.0" /> 99 </font></TextArea> 100 </children> 101 </Pane> 102 </center> 103</BorderPane> 104

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

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

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

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

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

guest

回答1

0

ベストアンサー

FXMLロード時にtxtAフィールドへTextAreaのインスタンスが設定されることが期待動作なのですが、それを行うためにはFXMLLoaderがFXML上に記述したノードがどのコントローラーのフィールドに対応するかを知らねばなりません。そのために使うのがfx:idになりますがご質問のFXML上にはfx:idが抜けているためtxtAフィールドに何も設定されない状態となりNPEが発生します。

期待通りにするにはFXML上の記述を以下のようにする必要があります。

<TextArea `fx:id="txtA"` layoutY="48.0" prefHeight="352.0" prefWidth="600.0"> FXMLLoaderはfx:id属性が付与されたノードのインスタンスをみつけると、「コントローラーにある@FXMLアノテーションが付与されていてfx:idの属性値(txtA)と同じ名前のフィールドへ設定する」という具合に動いてくれるのです。 --- 追記: 指摘できてなかった点がありましたので追記します。FXML上にコントローラークラスのクラス名が書いてあります。それはapplication.SampleControllerとなっていますが、ご質問のコードではtxtAというフィールドがコントローラーではなくアプリケーションクラスに書いてあります。 コントローラークラス上へtxtAを書いてください。コントローラークラスは次のように書きます。 ```Java package applicaton; public class SampleController implements Initializable { @FXML TextArea txtA; // FXMLLoaderがFXMLをロードする際にこのクラスのインスタンスを生成します。 // ロードが完了し、@FXMLアノテーションを付与したフィールドへの設定が完了すると // 以下のメソッドが自動的に呼ばれますのでここでさらに必要な初期化などが行えます。 // (FXML上に書ききれないような追加の初期化) @Override void initialize(...) { コントローラーの初期化 } ... } ``` このあたりはFXMLを用いたJavaFXの起動処理のお約束ですので一通りチュートリアルをやってみることをお勧めします。ネット上には古い仕様(JavaFXにスクリプトを用いていた時代のもの)があったりしますので本家本元のOracleのチュートリアルや新しい日付の記事を選んで参照することをお勧めします。

投稿2017/02/14 14:42

編集2017/02/14 15:50
KSwordOfHaste

総合スコア18394

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

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

mike2mike4

2017/02/14 15:14

早速の回答ありがとうございます。 教えて頂いたようにコードを直したところ、The controller 'SampleController' has no field 'txtA' というヒントボックスが出て残念ながらNullpointerExceptionは消えませんでした。
mike2mike4

2017/02/14 15:58

自分で解決できた! と思ったら、KSwordOfHasteさんのグットタイミングな回答が。やっと分かりました。これで眠れます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問