web-dev-qa-db-ja.com

fxmlコンボボックス、選択した値をjavafxに取得

fxmlコンボボックスの選択された値をキャッチしてjavafxクラスに実装するにはどうすればよいですか?

コンボボックスにfx:id "sample"を指定し、onAction = "#test"でボタンを作成し、.getValueと.getPromptTextを試しました。

@FXML private ComboBox<String> Sample;

@FXML protected void test( ActionEvent event ) { 
String output = (String) Sample.getValue();
System.out.println(output);

String output = (String) Sample.getPromptText();
System.out.println(output);
}

実行しようとするとエラーが発生します:

Java.lang.RuntimeException: Java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.Java:1440)
    at com.Sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.Java:69)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:217)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:170)
    at com.Sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.Java:38)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:37)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.EventUtil.fireEventImpl(EventUtil.Java:53)
    at com.Sun.javafx.event.EventUtil.fireEvent(EventUtil.Java:28)
    at javafx.event.Event.fireEvent(Event.Java:171)
    at javafx.scene.Node.fireEvent(Node.Java:6863)
    at javafx.scene.control.Button.fire(Button.Java:179)
    at com.Sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.Java:193)
    at com.Sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.Java:336)
    at com.Sun.javafx.scene.control.skin.SkinBase$4.handle(SkinBase.Java:329)
    at com.Sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.Java:64)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:217)
    at com.Sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.Java:170)
    at com.Sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.Java:38)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:37)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.Java:35)
    at com.Sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.Java:92)
    at com.Sun.javafx.event.EventUtil.fireEventImpl(EventUtil.Java:53)
    at com.Sun.javafx.event.EventUtil.fireEvent(EventUtil.Java:33)
    at javafx.event.Event.fireEvent(Event.Java:171)
    at javafx.scene.Scene$MouseHandler.process(Scene.Java:3324)
    at javafx.scene.Scene$MouseHandler.process(Scene.Java:3164)
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.Java:3119)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.Java:1559)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.Java:2261)
    at com.Sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.Java:228)
    at com.Sun.glass.ui.View.handleMouseEvent(View.Java:528)
    at com.Sun.glass.ui.View.notifyMouse(View.Java:922)
    at com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.Sun.glass.ui.win.WinApplication.access$100(WinApplication.Java:29)
    at com.Sun.glass.ui.win.WinApplication$3$1.run(WinApplication.Java:73)
    at Java.lang.Thread.run(Thread.Java:722)
Caused by: Java.lang.reflect.InvocationTargetException
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:601)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.Java:1435)
    ... 45 more
Caused by: Java.lang.NullPointerException
    at TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.Java:60)
    ... 50 more

前もって感謝します

ゾンビ

12
user2361460

あなたの質問にあるコードは、コード内のコンボボックス識別子のケースがfxml fx:idのそれと一致する限り機能するはずです。

この JavaFX fxmlコンボボックス選択デモンストレーションアプリ を変更して、comboBox getValue()メソッドとそれは私のためにうまくいった。

事案を確認してください。fx:idsampleですが、コードではSampleを使用していることに注意してください。そうでない場合、fxmlローダーは一致しません。ノードをコントローラーに正しく挿入します。

TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.Java:60)のコードが何であるかを言わないか、問題を再現するための完全な実行可能コードを提供しないため、コード内のNullPointerExceptionがコンボボックスの値取得の問題に関連する場合は言いにくいです。

7
jewelsea

これを試して:

String output = Sample.getSelectionModel().getSelectedItem().toString();
System.out.println(output);
31
RayFoX

ComboBoxの選択値を取得するには、Sample.getSelectionModelメソッドを使用できます。

例:

myComboBox.getSelectionModel().selectedItemProperty()
    .addListener(new ChangeListener<String>() {
        public void changed(ObservableValue<? extends String> observable,
                            String oldValue, String newValue) {
            System.out.println("Value is: "+newValue);
        }
});
3
Maulik Patel

私はこのエラーの答えを見つけようとしていました(同じ状況で私に起こったことです)。この投稿を見つけました。
実際にjewelseaが言ったようにComboBox識別子を正しく宣言した場合(とにかくそうでない場合は、他のエラーが表示されると思います)。

実際、すべてが適切に宣言されています(構文エラーやコンパイルエラーはありません)。
エラーはランタイムにあり、ComboBoxにデータを入力/追加すると、イベント@FXML protected void test(ActionEvent event)が実行されます。
ただし valueプロパティは、ユーザー入力が検出されていないため変更されていません(シーンを初期化するときにComboBoxにデータを追加していると想定しています)。
したがって、getValue()はnullを返します。

この場合、コードを壊した行は次のとおりです。

_System.out.println(output);
_

出力はnullであるためです。

test(ActionEvent event)メソッドの先頭にブレークポイントを配置してください。

他の人にも役立つと期待しています。

0
hmojica