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

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

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

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

Java

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

Q&A

解決済

2回答

788閲覧

JavaFXでキーイベントを取得して、TextFieldに表示させようとするとNullPointerExceptionが発生する

CreeperSaviour

総合スコア129

JavaFX

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

Java

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

0グッド

0クリップ

投稿2018/08/08 13:59

編集2018/08/09 11:48

前提・実現したいこと

JavaFXを使ってGUIを作成しています。
そこで、keyPressedを使ってキーイベントを取得して、TextFieldに表示させようとしています。

発生している問題

そこで、キー入力をするとGUIの方はフリーズし、以下に示したように
Eclipseでのデバッグ
となり、例外のNullPointerExceptionが発生していることは分かるのですが、何故その例外が発生しているのかが分からないです。
教えてほしいことは、
・ 何故その例外が発生するのか
・ どうしたら正常に動かすことができるか
・ (コードで改善すべき箇所)
です。
質問初心者ですので、不足している情報があれば是非指摘下さい。
よろしくお願いします。

該当のソースコード

Main.java

Java

1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.input.KeyEvent; 7import javafx.scene.layout.AnchorPane; 8import javafx.stage.Stage; 9 10 11public class Main extends Application { 12 @Override 13 public void start(Stage primaryStage) { 14 try { 15 AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("bbb.fxml")); 16 Scene scene = new Scene(root,400,400); 17 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 18 primaryStage.setScene(scene); 19 primaryStage.show(); 20 scene.setOnKeyPressed(this::keyPressed); 21 } catch(Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 26 public static void main(String[] args) { 27 launch(args); 28 } 29 30 private static String fulltext = ""; 31 32 private void keyPressed(KeyEvent e) { 33 switch(e.getCode()) { 34 case A: fulltext += "a"; 35 break; 36 case ACCEPT: 37 break; 38 case ADD: 39 break; 40 case AGAIN: 41 break; 42 case ALL_CANDIDATES: 43 break; 44 case ALPHANUMERIC: 45 break; 46 case ALT: 47 break; 48 case ALT_GRAPH: 49 break; 50 case AMPERSAND: 51 break; 52 case ASTERISK: 53 break; 54 case AT: 55 break; 56 case B: fulltext += "b"; 57 break; 58 case BACK_QUOTE: 59 break; 60 case BACK_SLASH: 61 break; 62 case BACK_SPACE: 63 if(fulltext != null && fulltext.length() > 0) { 64 fulltext = fulltext.substring(0, fulltext.length() - 1); 65 } 66 break; 67 case BEGIN: 68 break; 69 case BRACELEFT: 70 break; 71 case BRACERIGHT: 72 break; 73 case C: fulltext += "c"; 74 break; 75 case CANCEL: 76 break; 77 case CAPS: 78 break; 79 case CHANNEL_DOWN: 80 break; 81 case CHANNEL_UP: 82 break; 83 case CIRCUMFLEX: 84 break; 85 case CLEAR: 86 break; 87 case CLOSE_BRACKET: 88 break; 89 case CODE_INPUT: 90 break; 91 case COLON: 92 break; 93 case COLORED_KEY_0: 94 break; 95 case COLORED_KEY_1: 96 break; 97 case COLORED_KEY_2: 98 break; 99 case COLORED_KEY_3: 100 break; 101 case COMMA: 102 break; 103 case COMMAND: 104 break; 105 case COMPOSE: 106 break; 107 case CONTEXT_MENU: 108 break; 109 case CONTROL: 110 break; 111 case CONVERT: 112 break; 113 case COPY: 114 break; 115 case CUT: 116 break; 117 case D: fulltext += "d"; 118 break; 119 case DEAD_ABOVEDOT: 120 break; 121 case DEAD_ABOVERING: 122 break; 123 case DEAD_ACUTE: 124 break; 125 case DEAD_BREVE: 126 break; 127 case DEAD_CARON: 128 break; 129 case DEAD_CEDILLA: 130 break; 131 case DEAD_CIRCUMFLEX: 132 break; 133 case DEAD_DIAERESIS: 134 break; 135 case DEAD_DOUBLEACUTE: 136 break; 137 case DEAD_GRAVE: 138 break; 139 case DEAD_IOTA: 140 break; 141 case DEAD_MACRON: 142 break; 143 case DEAD_OGONEK: 144 break; 145 case DEAD_SEMIVOICED_SOUND: 146 break; 147 case DEAD_TILDE: 148 break; 149 case DEAD_VOICED_SOUND: 150 break; 151 case DECIMAL: 152 break; 153 case DELETE: 154 break; 155 case DIGIT0: 156 break; 157 case DIGIT1: 158 break; 159 case DIGIT2: 160 break; 161 case DIGIT3: 162 break; 163 case DIGIT4: 164 break; 165 case DIGIT5: 166 break; 167 case DIGIT6: 168 break; 169 case DIGIT7: 170 break; 171 case DIGIT8: 172 break; 173 case DIGIT9: 174 break; 175 case DIVIDE: 176 break; 177 case DOLLAR: 178 break; 179 case DOWN: 180 break; 181 case E: fulltext += "e"; 182 break; 183 case EJECT_TOGGLE: 184 break; 185 case END: 186 break; 187 case ENTER: 188 break; 189 case EQUALS: 190 break; 191 case ESCAPE: 192 break; 193 case EURO_SIGN: 194 break; 195 case EXCLAMATION_MARK: 196 break; 197 case F: fulltext += "f"; 198 break; 199 case F1: 200 break; 201 case F10: 202 break; 203 case F11: 204 break; 205 case F12: 206 break; 207 case F13: 208 break; 209 case F14: 210 break; 211 case F15: 212 break; 213 case F16: 214 break; 215 case F17: 216 break; 217 case F18: 218 break; 219 case F19: 220 break; 221 case F2: 222 break; 223 case F20: 224 break; 225 case F21: 226 break; 227 case F22: 228 break; 229 case F23: 230 break; 231 case F24: 232 break; 233 case F3: 234 break; 235 case F4: 236 break; 237 case F5: 238 break; 239 case F6: 240 break; 241 case F7: 242 break; 243 case F8: 244 break; 245 case F9: 246 break; 247 case FAST_FWD: 248 break; 249 case FINAL: 250 break; 251 case FIND: 252 break; 253 case FULL_WIDTH: 254 break; 255 case G: fulltext += "g"; 256 break; 257 case GAME_A: 258 break; 259 case GAME_B: 260 break; 261 case GAME_C: 262 break; 263 case GAME_D: 264 break; 265 case GREATER: 266 break; 267 case H: fulltext += "h"; 268 break; 269 case HALF_WIDTH: 270 break; 271 case HELP: 272 break; 273 case HIRAGANA: 274 break; 275 case HOME: 276 break; 277 case I: fulltext += "i"; 278 break; 279 case INFO: 280 break; 281 case INPUT_METHOD_ON_OFF: 282 break; 283 case INSERT: 284 break; 285 case INVERTED_EXCLAMATION_MARK: 286 break; 287 case J: fulltext += "j"; 288 break; 289 case JAPANESE_HIRAGANA: 290 break; 291 case JAPANESE_KATAKANA: 292 break; 293 case JAPANESE_ROMAN: 294 break; 295 case K: fulltext += "k"; 296 break; 297 case KANA: 298 break; 299 case KANA_LOCK: 300 break; 301 case KANJI: 302 break; 303 case KATAKANA: 304 break; 305 case KP_DOWN: 306 break; 307 case KP_LEFT: 308 break; 309 case KP_RIGHT: 310 break; 311 case KP_UP: 312 break; 313 case L: fulltext += "l"; 314 break; 315 case LEFT: 316 break; 317 case LEFT_PARENTHESIS: 318 break; 319 case LESS: 320 break; 321 case M: fulltext += "m"; 322 break; 323 case META: 324 break; 325 case MINUS: 326 break; 327 case MODECHANGE: 328 break; 329 case MULTIPLY: 330 break; 331 case MUTE: 332 break; 333 case N: fulltext += "n"; 334 break; 335 case NONCONVERT: 336 break; 337 case NUMBER_SIGN: 338 break; 339 case NUMPAD0: 340 break; 341 case NUMPAD1: 342 break; 343 case NUMPAD2: 344 break; 345 case NUMPAD3: 346 break; 347 case NUMPAD4: 348 break; 349 case NUMPAD5: 350 break; 351 case NUMPAD6: 352 break; 353 case NUMPAD7: 354 break; 355 case NUMPAD8: 356 break; 357 case NUMPAD9: 358 break; 359 case NUM_LOCK: 360 break; 361 case O: fulltext += "o"; 362 break; 363 case OPEN_BRACKET: 364 break; 365 case P: fulltext += "p"; 366 break; 367 case PAGE_DOWN: 368 break; 369 case PAGE_UP: 370 break; 371 case PASTE: 372 break; 373 case PAUSE: 374 break; 375 case PERIOD: 376 break; 377 case PLAY: 378 break; 379 case PLUS: 380 break; 381 case POUND: 382 break; 383 case POWER: 384 break; 385 case PREVIOUS_CANDIDATE: 386 break; 387 case PRINTSCREEN: 388 break; 389 case PROPS: 390 break; 391 case Q: fulltext += "q"; 392 break; 393 case QUOTE: 394 break; 395 case QUOTEDBL: 396 break; 397 case R: fulltext += "r"; 398 break; 399 case RECORD: 400 break; 401 case REWIND: 402 break; 403 case RIGHT: 404 break; 405 case RIGHT_PARENTHESIS: 406 break; 407 case ROMAN_CHARACTERS: 408 break; 409 case S: fulltext += "s"; 410 break; 411 case SCROLL_LOCK: 412 break; 413 case SEMICOLON: 414 break; 415 case SEPARATOR: 416 break; 417 case SHIFT: 418 break; 419 case SHORTCUT: 420 break; 421 case SLASH: 422 break; 423 case SOFTKEY_0: 424 break; 425 case SOFTKEY_1: 426 break; 427 case SOFTKEY_2: 428 break; 429 case SOFTKEY_3: 430 break; 431 case SOFTKEY_4: 432 break; 433 case SOFTKEY_5: 434 break; 435 case SOFTKEY_6: 436 break; 437 case SOFTKEY_7: 438 break; 439 case SOFTKEY_8: 440 break; 441 case SOFTKEY_9: 442 break; 443 case SPACE: 444 break; 445 case STAR: 446 break; 447 case STOP: 448 break; 449 case SUBTRACT: 450 break; 451 case T: fulltext += "t"; 452 break; 453 case TAB: 454 break; 455 case TRACK_NEXT: 456 break; 457 case TRACK_PREV: 458 break; 459 case U: fulltext += "u"; 460 break; 461 case UNDEFINED: 462 break; 463 case UNDERSCORE: 464 break; 465 case UNDO: 466 break; 467 case UP: 468 break; 469 case V: fulltext += "v"; 470 break; 471 case VOLUME_DOWN: 472 break; 473 case VOLUME_UP: 474 break; 475 case W: fulltext += "w"; 476 break; 477 case WINDOWS: 478 break; 479 case X: fulltext += "x"; 480 break; 481 case Y: fulltext += "y"; 482 break; 483 case Z: fulltext += "z"; 484 break; 485 default: 486 break; 487 } 488 if(fulltext != null) bbb.textField.setText(fulltext); 489 System.out.println(fulltext); 490 } 491 492} 493

bbb.java

package application; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TextField; public class bbb implements Initializable{ @Override public void initialize(URL location, ResourceBundle resources){ } @FXML private static TextField textField; }

bbb.fxml

<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="400.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.bbb"> <children> <TextField fx:id="textField" disable="true" editable="false" layoutX="126.0" layoutY="188.0" /> </children> </AnchorPane>

試したこと

Main.javaで下から6行目の前にif(fulltext != null)を追加しfulltextがnullではないか調べたが、それでも例外が出る。

補足情報(FW/ツールのバージョンなど)

Java 10.0.2
JavaSE 10.0.2
Eclipse 4.7(Oxygen)
JavaFX Scene Builder 2.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

例外は同じですか?

例外は同じです。

fulltextのstaticを外すと...

変わらないです。

textFieldのstatic...

この場合Main.javaから読み込めなくなるので(getterやsetterを使えば別ですが..)できません。

そもそもstaticがあること自体おかしいのです。
意図を分かってもらえないので、私の方で修正してみました。
// ■の行が修正した個所です。

Main.javaとbbb.javaを以下のように変えましょう。
文字数制限があるので、keyPressedメソッドをいじってあります。

Main.java

Java

1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.input.KeyEvent; 7import javafx.scene.layout.AnchorPane; 8import javafx.stage.Stage; 9 10 11public class Main extends Application { 12 @Override 13 public void start(Stage primaryStage) { 14 try { 15 // ■修正箇所 16 FXMLLoader loader = new FXMLLoader(getClass().getResource("bbb.fxml")); 17 AnchorPane root = (AnchorPane)loader.load(); 18 ctrl = loader.getController(); 19 Scene scene = new Scene(root,400,400); 20 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 21 primaryStage.setScene(scene); 22 primaryStage.show(); 23 scene.setOnKeyPressed(this::keyPressed); 24 } catch(Exception e) { 25 e.printStackTrace(); 26 } 27 } 28 29 public static void main(String[] args) { 30 launch(args); 31 } 32 // ■追加 33 private bbb ctrl = null; // コントローラクラスの保持 34 private String fulltext = ""; // staticいらない 35 36 private void keyPressed(KeyEvent e) { 37 switch(e.getCode()) { 38 case A: fulltext += "a"; 39 break; 40 case BACK_SPACE: 41 if(fulltext != null && fulltext.length() > 0) { 42 fulltext = fulltext.substring(0, fulltext.length() - 1); 43 } 44 break; 45 case B: fulltext += "b"; 46 break; 47 case C: fulltext += "c"; 48 break; 49 case D: fulltext += "d"; 50 break; 51 case E: fulltext += "e"; 52 break; 53 case F: fulltext += "f"; 54 break; 55 case G: fulltext += "g"; 56 break; 57 case H: fulltext += "h"; 58 break; 59 case I: fulltext += "i"; 60 break; 61 case J: fulltext += "j"; 62 break; 63 case K: fulltext += "k"; 64 break; 65 case L: fulltext += "l"; 66 break; 67 case M: fulltext += "m"; 68 break; 69 case N: fulltext += "n"; 70 break; 71 case O: fulltext += "o"; 72 break; 73 case P: fulltext += "p"; 74 break; 75 case Q: fulltext += "q"; 76 break; 77 case R: fulltext += "r"; 78 break; 79 case S: fulltext += "s"; 80 break; 81 case T: fulltext += "t"; 82 break; 83 case U: fulltext += "u"; 84 break; 85 case V: fulltext += "v"; 86 break; 87 case W: fulltext += "w"; 88 break; 89 case X: fulltext += "x"; 90 break; 91 case Y: fulltext += "y"; 92 break; 93 case Z: fulltext += "z"; 94 break; 95 default: 96 break; 97 } 98 // ■修正箇所 99 if(fulltext != null) ctrl.getTextField().setText(fulltext); 100 System.out.println(fulltext); 101 } 102 103}

bbb.java

Java

1package application; 2 3import java.net.URL; 4import java.util.ResourceBundle; 5 6import javafx.fxml.FXML; 7import javafx.fxml.Initializable; 8import javafx.scene.control.TextField; 9 10public class bbb implements Initializable{ 11 12 @Override 13 public void initialize(URL location, ResourceBundle resources){ } 14 15 @FXML 16 private TextField textField; // staticいらない 17 18 // ■追加箇所 19 public TextField getTextField() { 20 return textField; 21 } 22 23 public void setTextField(TextField textField) { 24 this.textField = textField; 25 } 26}

上記のように変えたところ、以下のように起動できました。
起動したところ

投稿2018/08/09 21:32

編集2018/08/09 21:37
phoenix3430025

総合スコア135

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

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

CreeperSaviour

2018/08/09 22:34

わざわざありがとうございます。 記載していただいたコードを写し、やっと期待する結果が得られました。 コントローラークラスを作った後で保持することで解決できるのですね。 今後の開発に役立てたいと思います。ありがとうございました。
phoenix3430025

2018/08/10 03:32

コントローラクラスを「作った」後ではなく、「取得」した後です。そこは勘違いしないように。
guest

0

bbb.fxmlで指定しているfx:controller="application.bbb"のクラスを結びつけていないので当たり前です。
とりあえず以下が参考になりますか?
JavaFXのFXMLのコントローラーのメモ。
JavaFXのコントローラークラスとイベント処理を知る(注意:会員でないと全部は読めません)

コントローラクラスは後回しとするなら、
fx:controller指定は削除すべきです、以下のページを参考にしましょう。
4 FXMLを使用したカスタム・コントロールの作成

投稿2018/08/08 21:11

編集2018/08/08 21:19
phoenix3430025

総合スコア135

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

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

CreeperSaviour

2018/08/09 11:50

回答有り難うございます。 application/bbb.javaに書くのを忘れていたので追加しましたが、問題は改善されません。質問を編集しましたので、悪い点を教えていただけたら幸いです。
phoenix3430025

2018/08/09 14:32 編集

例外は同じですか? 同じであれば、controllerの有無は関係なさそうです。失礼しました。 気になる点としては、 Main.javaのfulltextがstaticなのに対して、keyPressedメソッドはstaticメソッドじゃないですね。 fulltextのstaticを外すとどうなりますか。 bbb.javaのtextFieldもstaticですね。要らないと思うのですが。・・・
CreeperSaviour

2018/08/09 14:49

例外は同じですか? >> 例外は同じです。 fulltextのstaticを外すと... >> 変わらないです。 textFieldのstatic... >> この場合Main.javaから読み込めなくなるので(getterやsetterを使えば別ですが..)できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問