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

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

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

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

Q&A

解決済

1回答

7376閲覧

TextFieldのOn Input Method Text Changedを拾えない

crow8

総合スコア13

JavaFX

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

0グッド

0クリップ

投稿2015/12/23 05:39

編集2015/12/23 05:50

TextFieldのOn Input Method Text Changedで、一文字入力ごとに処理をしようと思いましたが、イベントが拾えませんでした。
abcと入力した時、入力するたびに、
Text:a
Text:ab
Text:abc
と表示されるつもりでしたが、ボタンをクリックするまで何も表示されず、
ボタンクリックで、
Mouse:abc
と表示されます。
何か決定的な勘違いをしているのでしょうか?

Main.java

Java

1package sample; 2 3import javafx.application.Application; 4import javafx.application.ConditionalFeature; 5import javafx.application.Platform; 6import javafx.fxml.FXMLLoader; 7import javafx.scene.Parent; 8import javafx.scene.Scene; 9import javafx.stage.Stage; 10 11/** 12 * キーテストプログラム 13 */ 14public class Main extends Application { 15 @Override 16 public void start(Stage primaryStage) { 17 try { 18 FXMLLoader loader = new FXMLLoader(getClass().getResource("KeyTest.fxml")); 19 Parent root = loader.load(); 20 Scene scene = new Scene(root,400,300); 21 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 22 primaryStage.setScene(scene); 23 primaryStage.setTitle("KeyTest"); 24 25 //以下の出力はtrue 26 System.out.println(Platform.isSupported(ConditionalFeature.INPUT_METHOD)); 27 28 primaryStage.show(); 29 } catch(Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34 public static void main(String[] args) { 35 launch(args); 36 } 37} 38

KeyTestController.java

Java

1package sample; 2 3import javafx.fxml.FXML; 4import javafx.scene.control.TextField; 5import javafx.scene.input.InputMethodEvent; 6import javafx.scene.input.MouseEvent; 7 8/** 9 * メイン画面(コントローラ) 10 * @author torii 11 * 12 */ 13public class KeyTestController { 14 15 @FXML 16 private TextField srcText; 17 18/** 19 * TextFieldChanged 20 */ 21 @FXML 22 private void txtChanged(InputMethodEvent event){ 23 //↓出力されない 24 System.out.println("Text:" + srcText.getText()); 25 } 26 27 @FXML 28 private void btClicked(MouseEvent event){ 29 //↓出力される 30 System.out.println("Mouse:" + srcText.getText()); 31 } 32} 33 34

KeyTest.fxml

XML

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.*?> 4<?import java.lang.*?> 5<?import javafx.scene.layout.*?> 6<?import javafx.scene.layout.BorderPane?> 7 8<BorderPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.KeyTestController"> 9 <center> 10 <AnchorPane prefHeight="131.0" prefWidth="332.0" BorderPane.alignment="CENTER"> 11 <children> 12 <TextField fx:id="srcText" layoutX="14.0" layoutY="14.0" onInputMethodTextChanged="#txtChanged" /> 13 <Button layoutX="174.0" layoutY="14.0" mnemonicParsing="false" onMouseClicked="#btClicked" text="Button" /> 14 </children> 15 </AnchorPane> 16 </center> 17</BorderPane> 18

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

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

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

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

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

guest

回答1

0

ベストアンサー

onInputMethodTextChangedというのはIMEなどのInput Methodからのテキスト変更を受け取るイベント、
つまり、IMEオンのときに入力が確定されたテキストが通知されるイベントらしいです。

今回の場合は、onKeyPressedに割り当てるのが良いんじゃないでしょうか。
キーを離したタイミングにしたいなら、onKeyReleasedにしてください。
txtChangedメソッドも、下記のように書き換えてください。
Platform.runLaterを使っているのは、これを使わないと最後に入力した文字がsrcTextに反映されないからです。

lang

1@FXML 2private void txtChanged(KeyEvent event){ 3 Platform.runLater(() -> { 4 System.out.println("Text:" + srcText.getText()); 5 }); 6}

参考リンク:

InputMethodEvent - JavaFX 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/input/InputMethodEvent.html

投稿2015/12/23 06:37

argius

総合スコア9390

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

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

crow8

2015/12/23 07:12

ありがとうございます。 onKeyReleasedで処理してみたところ、希望通りの処理が実装できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問