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

2013年05月08日に質問されました。  ·  閲覧回数 82.8k回  ·  ソース

user2361460 picture
2013年05月08日

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

前もって感謝します

ゾンビ

回答

RayFoX picture
2013年07月26日
33

これを試して:

String output = Sample.getSelectionModel().getSelectedItem();
System.out.println(output);
jewelsea picture
2013年05月09日
7

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

このJavaFXfxmlコンボボックス選択デモンストレーションアプリを変更して、onActionメソッドを持つボタンを追加し、comboBox getValue()メソッドを使用してコンボボックスから値を取得しましたが、正常に機能しました。

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

コード内のNullPointerExceptionがコンボボックス値の取得の問題に関連しているかどうかはわかりません。 TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.java:60)のコードが何であるかを述べていないか、問題を再現するための完全な実行可能コードを提供しているからです。

Maulik Patel picture
2014年03月22日
3

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);
        }
});
hmojica picture
2014年05月13日
0

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

事実、すべてが適切に宣言されています(構文エラーやコンパイルエラーはありません)。
エラーは実行時に発生します。ComboBoxにデータを入力/追加すると、イベント@FXML protected void test(ActionEvent event)が実行されます。
ただし、ユーザー入力が検出されていないため
したがって、 getValue()はnullを返します。

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

System.out.println(output);

出力はnullです。

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

私はこれが他の人にも役立つことを期待しています。