it-swarm.com.ru

комбинированный список fxml, получить выбранное значение в javafx

как я могу поймать выбранное значение комбинированного списка fxml и реализовать его в классе javafx?

я дал комбинированному списку «образец» fx: id и создал кнопку с 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

Заранее спасибо

Живой мертвец

10
user2361460

Я думаю, что код, который у вас есть в вашем вопросе, должен работать до тех пор, пока регистр идентификатора комбинированного списка в коде совпадает с регистром вашего fxml fx:id.

Я изменил это демонстрационное приложение JavaFX fxml для выбора поля со списком , добавив кнопку с методом onAction для извлечения значения из поля со списком с помощью метода comboBox getValue(), и он работал нормально для меня.

Проверьте ситуацию, я заметил, что вы говорите, что fx:id является sample, но в вашем коде вы используете Sample - и случаи должны совпадать, иначе загрузчик fxml не будет корректно вводить узел в ваш контроллер.

Трудно сказать, связано ли NullPointerException в вашем коде с проблемой получения значения в поле со списком, поскольку вы не говорите, что представляет собой код в TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.Java:60), или не предоставляете полный исполняемый код для репликации проблемы.

6
jewelsea

Попробуй это:

String output = Sample.getSelectionModel().getSelectedItem().toString();
System.out.println(output);
28
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);
        }
});
2
Maulik Patel

Я пытался найти ответ на эту ошибку (которая только что произошла со мной в тех же условиях) и нашел этот пост.
Если вы на самом деле объявили свой идентификатор ComboBox правильно, как сказал jewelsea (если бы не так, я думаю, что появилась бы другая ошибка).

Дело в том, что все было хорошо заявлено (без синтаксической ошибки или ошибки компиляции).
Ошибка во время выполнения, событие @FXML protected void test(ActionEvent event) выполняется при заполнении/добавлении данных в ComboBox.
Но свойство value не изменяется, так как пользовательский ввод не был обнаружен (я предполагаю, что вы добавляете данные в ваш ComboBox где-то еще, когда вы инициализируете сцену).
Итак, getValue() возвращает ноль.

В этом случае строка, которая сломала код:

System.out.println(output);

Потому что вывод null.

Попробуйте поставить точку останова в начале метода test(ActionEvent event).

Я ожидаю, что эта помощь также другие.

0
hmojica