2016-05-01 4 views
1

Ich bekomme NullPointerException, wenn org.controlsfx.control.RangeSlider verwendet wird. Hier ist die einfache Codebeispiel:RangeSlider verursacht NullPointerException beim Drücken der Tabulatortaste auf dem Fokus-Schieberegler

package experimental_main; 

import org.controlsfx.control.RangeSlider; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 


public class Experimental_start extends Application 
{ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 


    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     Button button = new Button("Click me"); 
     RangeSlider rangeSlider = new RangeSlider(0, 10, 2, 4); 

     BorderPane borderPane = new BorderPane(); 
     borderPane.setCenter(rangeSlider); 
     borderPane.setTop(button); 

     Scene scene = new Scene(borderPane, 300, 300); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

Die Ausnahme tritt auf, wenn Tab drücken, während Daumen der rechten Hand von RangeSlider fokussiert ist oder Drücken von Shift + Tab, während seine linke Daumen konzentriert. Diese Tastenbetätigungen führen dazu, dass der Fokus von RangeSlider wie erwartet verloren geht, aber diese Aktion verursacht auch NullPointerException. Hier Ausnahme der Stack-Trace:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
at com.sun.javafx.scene.traversal.TraversalEngine.select(Unknown Source) 
at impl.org.controlsfx.skin.RangeSliderSkin$5.handle(RangeSliderSkin.java:150) 
at impl.org.controlsfx.skin.RangeSliderSkin$5.handle(RangeSliderSkin.java:132) 
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.EventUtil.fireEventImpl(Unknown Source) 
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
at javafx.event.Event.fireEvent(Unknown Source) 
at javafx.scene.Scene$KeyHandler.process(Unknown Source) 
at javafx.scene.Scene$KeyHandler.access$1800(Unknown Source) 
at javafx.scene.Scene.impl_processKeyEvent(Unknown Source) 
at javafx.scene.Scene$ScenePeerListener.keyEvent(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$353(Unknown Source) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(Unknown Source) 
at com.sun.glass.ui.View.handleKeyEvent(Unknown Source) 
at com.sun.glass.ui.View.notifyKey(Unknown Source) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Es gibt keine Ausnahme, wenn das Drücken der Tabulatortaste (oder Shift + Tab) mit Blick RangeSlider Daumen zu machen konzentriert.

Mache ich etwas falsch oder es ist ein Fehler? Gibt es eine Alternative zu den Realisierungen der RangeSlider-Klasse?

Antwort

1

Dieser Hörer des RangeSliderSkin scheint die NPE zu verursachen:

EventHandler<KeyEvent> keyEventHandler = new EventHandler<KeyEvent>() { 
      @Override public void handle(KeyEvent event) { 
       if (KeyCode.TAB.equals(event.getCode())) { 
        if (lowThumb.isFocused()) { 
         if (event.isShiftDown()) { 
          lowThumb.setFocus(false); 
          new ParentTraversalEngine(rangeSlider).select(rangeSlider, Direction.PREVIOUS); 
         } else { 
          lowThumb.setFocus(false); 
          highThumb.setFocus(true); 
         } 
         event.consume(); 
        } else if (highThumb.isFocused()) { 
         if(event.isShiftDown()) { 
          highThumb.setFocus(false); 
          lowThumb.setFocus(true); 
         } else { 
          highThumb.setFocus(false); 
          new ParentTraversalEngine(rangeSlider).select(rangeSlider, Direction.NEXT); 
         } 
         event.consume(); 
        } 
       } 
      } 
     }; 

Um genauer zu sein, die Linie new ParentTraversalEngine(rangeSlider).select(rangeSlider, Direction.NEXT); ParentTraversalEngine wird initialisiert ohne Algorithm Argument, so ruft select(rangeSlider, Direction.NEXT) ein NPE verursacht, wie es ist soll:

Würfe: java.lang.NullPointerException - wenn es keinen Algorithmus

javadoc

+0

Das Problem ist genau das, was Sie beschrieben haben. Ich habe den Weg nicht gefunden, um zu bestimmen, welcher Bereich von sliders Daumen genau fokussiert ist. Das Layout in fxml hilft auch nicht. Der einzige Weg, den ich sehe, ist, alle Tab-Drucke zu verbrauchen, wenn das 'RangeSlider'-Objekt fokussiert ist. Danke für den Hinweis. – Cryptor

+1

Sie können einen Bezug zu den Thumbs herstellen, indem Sie 'node.lookup (selector)' 'verwenden:' Node lowThumb = rangeSlider.lookup (". Low-thumb"); Knoten highThumb = rangeSlider.lookup (". High-thumb"); ' – jns

+0

' rangeSlider.lookup (". Range-slider") 'findet Knoten mit der Klasse" .range-slider ". Aber 'rangeSlider.lookup (". Low-thumb ")' und 'rangeSlider.lookup (". High-thumb ")' geben beide 'null' zurück. Alle diese Klassen und einige andere (die auch nicht gefunden werden können) existieren in '" org \ controlsfx \ control \ rangeslider.css "' was ich in 'controlsfx-8.40.10.jar' gefunden habe. Die einzige Besonderheit ist, dass ".range-slider" in dieser css-Datei immer eine "high level" ist (jeder Part beginnt mit ".range-slider .some_sub_class" '). Ich habe das Gefühl, dass ich falsch herum laufe ... ((( – Cryptor

0

Der Fehler ist fest Beginn ab Version 8.40.13.

Verwandte Themen