2013-05-08 46 views
7

làm cách nào tôi có thể nắm bắt giá trị được chọn của một combobox fxml và triển khai nó thành một lớp javafx?combobox fxml, lấy giá trị đã chọn vào javafx

tôi đã cung cấp cho combobox mẫu fx: id "và tạo một nút với onAction =" # test "và thử .getValue và .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); 
} 

Nếu tôi cố gắng để chạy nó tôi nhận được một lỗi:

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 

Cảm ơn trước

Zombie

Trả lời

6

Tôi nghĩ rằng mã bạn có trong câu hỏi của bạn nên làm việc càng lâu như trường hợp của số nhận dạng combobox trong mã khớp với mã số của fxml fx:id.

Tôi đã sửa đổi số này JavaFX fxml combo box selection demonstration app để thêm nút có phương pháp onAction để truy xuất giá trị từ hộp tổ hợp bằng phương thức comboBox getValue() và nó hoạt động tốt cho tôi.

Kiểm tra trường hợp của sự vật, tôi nhận thấy rằng bạn nói rằng fx:idsample, nhưng trong mã của bạn bạn sử dụng Sample - và các trường hợp phải khớp với nhau nếu trình nạp fxml không đưa nút vào bộ điều khiển của bạn một cách chính xác.

Khó để nói nếu mã NullPointerException trong mã của bạn có liên quan đến vấn đề truy xuất giá trị hộp combo của bạn vì bạn không nói mã ở số TW_JAVAFX_Undecorator.ButtonController.pruefen(ButtonController.java:60) là hoặc cung cấp mã thực thi đầy đủ để tái tạo sự cố.

25

Hãy thử điều này:

String output = Sample.getSelectionModel().getSelectedItem().toString(); 
System.out.println(output); 
+0

Điều này đã giúp tôi! Tôi đã tìm phương pháp đúng để lấy chỉ mục và mục đã chọn, vì getValue ở nơi khác và mục được chọn ở đây. –

+0

Sample.getSelectionModel(). GetSelectedIndex() – QuadX

+3

Truyền thừa. toString() luôn là kiểu String. – Zon

2

Để có được giá trị ComboBox chọn, bạn có thể sử dụng phương pháp Sample.getSelectionModel.

Ví dụ:

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

cảm ơn nó đã làm việc cho tôi. –

0

Tôi đã cố gắng tìm một câu trả lời cho lỗi này (mà vừa xảy ra với tôi trong cùng điều kiện) và tìm thấy bài đăng này.
Nếu bạn thực sự khai báo nhận dạng ComboBox của bạn đúng như jewelsea đã nói (Nếu không thì tôi nghĩ rằng lỗi khác sẽ xuất hiện).

Thực tế là mọi thứ đã được khai báo rõ ràng (không có lỗi cú pháp hoặc lỗi biên dịch).
Lỗi trong thời gian chạy, sự kiện @FXML protected void test(ActionEvent event) đang được thực hiện khi bạn điền/thêm dữ liệu vào ComboBox của mình.
Nhưng giá trị bất động sản không thay đổi vì không có đầu vào của người dùng đã được phát hiện (tôi giả sử bạn đang thêm dữ liệu vào ComboBox của bạn ở một nơi khác khi bạn khởi tạo Scene).
Vì vậy, getValue() sẽ trả về giá trị rỗng.

Trong trường hợp này dòng đó bị phá vỡ mã là:

System.out.println(output); 

Bởi vì đầu ra là null.

Cố gắng đặt điểm ngắt vào đầu phương thức test(ActionEvent event).

Tôi hy vọng điều này cũng giúp ích cho người khác.

Các vấn đề liên quan