2015-07-04 2 views
0

Я хочу иметь поле со списком, когда выбран конкретный элемент, поле со списком становится редактируемым. К сожалению, мой код для этого продолжает бросать исключение:JavaFX - ComboBox.setEditable() Index out of Bounds Exception

package application; 

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.VBox; 


public class Main extends Application 
{  
    ComboBox<String> comboBox; 

    @Override 
    public void start(Stage primaryStage) 
    { 
    comboBox = new ComboBox<String>(); 
    comboBox.getItems().add("Editable Item"); 
    comboBox.setOnAction(e -> comboBox.setEditable(true)); 

    VBox vBox = new VBox(); 
    vBox.getChildren().add(comboBox); 

    Scene scene = new Scene(vBox, 128, 128); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

    public static void main(String[] args) 
    { 
    launch(args); 
    } 
} 

Вот трассировки стека:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException 
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(Unknown Source) 
    at javafx.collections.ListChangeListener$Change.getAddedSubList(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.ListViewBehavior.lambda$new$178(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.ListViewBehavior$$Lambda$128/1234852073.onChanged(Unknown Source) 
    at javafx.collections.WeakListChangeListener.onChanged(Unknown Source) 
    at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source) 
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.callObservers(Unknown Source) 
    at javafx.scene.control.MultipleSelectionModelBase.clearAndSelect(Unknown Source) 
    at javafx.scene.control.ListView$ListViewBitSetSelectionModel.clearAndSelect(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.CellBehaviorBase.simpleSelect(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.CellBehaviorBase.doSelect(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.CellBehaviorBase.mousePressed(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.process(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source) 
    at javafx.scene.Scene.impl_processMouseEvent(Unknown Source) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$183/1274446857.get(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.notifyMouse(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/1232367853.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Кто-нибудь знает, почему это происходит? Можно ли сделать поле со списком редактируемым, когда выбран конкретный элемент?

+1

Опубликовать трассировку стека. 'getValue()' будет бросать NPE перед 'setEditable', если' comboBox' был 'null', поэтому было бы странно, если бы' setEditable' выбрасывал NPE –

+0

. Я включил трассировку стека в соответствии с запросом и добавила println, чтобы показать состояние переменной перед оператором if. – 5had3sofQu4rtz

+0

Что находится в строке 59 'Controller'? –

ответ

0

Ваш NPE брошено этой линией

if(item.equals(editableItem)) 

где item является нулевым. Чтобы сохранить такие уравнения NPE безопасны вы скорее должны сделать

if("editable".equals(item)) 

Это никогда бы не thorw NPE, даже если item будет нулевым.

+0

Он не будет бросать NPE, но он все равно даст ему неправильные результаты. Все это делает преобразование его в логическую задачу. «Equals» для трюка с нулевой отметкой - аккуратный, но это ужасная бандана, которая не фиксирует ситуацию (в данном случае, по крайней мере). Не говоря уже о том, что я задаюсь вопросом, что заставляет вас думать, что 'item' является« null », поскольку в его коде нет ничего, что могло бы предложить его (за исключением того, что вы предполагаете, что это проблема, поскольку вы можете почувствовать« comboBox' isn » t 'null') –

+0

@VinceEmigh, потому что прямо перед консолью NPE так говорит? – Antoniossss

+0

На консоли отображается строка 59 Controller.java. Вы знаете, в какой строке 59? Поскольку он не маркировал номера строк в своем коде, он сообщает нам, какая строка - строка 59, и я не вижу ничего в трассе стека, предполагая, что это будет «item». Я не пытался грубить, я просто не понимаю, как вы пришли к такому выводу. Что я не вижу, что вы?Можно было сделать только предположение, что 'item' был' null', видя, как в трассировке стека нет слов об этом. –