2

When I click on Custom Color link I get this horrible NullPointerException:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at javafx.stage.Window$9.invalidated(Window.java:867)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144)
at javafx.stage.Window.setShowing(Window.java:922)
at javafx.stage.Window.show(Window.java:937)
at javafx.stage.Stage.show(Stage.java:259)
at com.sun.javafx.scene.control.skin.CustomColorDialog.show(CustomColorDialog.java:170)
at com.sun.javafx.scene.control.skin.ColorPalette$1.handle(ColorPalette.java:127)
at com.sun.javafx.scene.control.skin.ColorPalette$1.handle(ColorPalette.java:105)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Hyperlink.fire(Hyperlink.java:153)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)

How it looks:

enter image description here

Is any possibility to fix it? Maybe there is some way to cut that link in the bottom? Code:

colorMenu = new Menu("Color");
    ColorPicker colorPicker = new ColorPicker();
    colorPicker.setValue(Color.FIREBRICK);
    m_palette = new MenuItem(null, colorPicker);
    m_palette.setOnAction(event -> gameScene.setCellColor(colorPicker.getValue()));

Thanks for any advices!

Nemus
  • 3,879
  • 12
  • 38
  • 57
Mateusz Tapa
  • 31
  • 1
  • 5
  • Not a duplicate of "What is a Null Pointer Exception", as the stack trace contains no client code. – James_D Mar 15 '17 at 14:31
  • Which JDK version are you using? – James_D Mar 15 '17 at 14:31
  • Seems similar http://stackoverflow.com/questions/26768955/javafx-colorpicker-wont-bring-up-customcolor-pop-up-dialog-box. They suggest to update Java. – gvlachakis Mar 15 '17 at 14:43
  • Yeah, that looks pretty much broken no matter how you run it. On my Mac, for versions <= 8u40 it will open the custom color "nested dialog" but will crash (literally - the JVM crashes) when I dismiss it. On later versions the custom color dialog appears for an instant and immediately closes, after which the color picker dialog itself will not open again. – James_D Mar 15 '17 at 14:51
  • I'm using 1.8.0_101 version. I will update JDK and see if it helps. – Mateusz Tapa Mar 15 '17 at 14:59
  • Updating JDK didn't fixed problem – Mateusz Tapa Mar 15 '17 at 15:39

2 Answers2

2

It is possible to remove the offending Hyperlink from the ColorPicker. Here, we make a ColorPicker with our own ColorPickerSkin. We can then intercept the creation of the popup content in the Skin before it is returned in order to remove the Hyperlink.

public class CustomColorPicker extends ColorPicker {

    @Override
    protected Skin<?> createDefaultSkin() {
        return new CustomColorPickerSkin(this);
    }

    private class CustomColorPickerSkin extends ColorPickerSkin {

        public CustomColorPickerSkin(ColorPicker control) {
            super(control);
        }

        @Override
        protected Node getPopupContent() {
            Node colorPalette = super.getPopupContent(); // This is an instance of private API ColorPalette which
                                                            // extends Region
            Region r = (Region) colorPalette;
            List<Node> vboxes = r.getChildrenUnmodifiable().stream().filter(e -> {
                return e instanceof VBox;
            }).collect(Collectors.toList()); // This ColorPalette contains a VBox which contains the Hyperlink we want
                                                // to remove.
            for (Node n : vboxes) {
                VBox vbox = (VBox) n;
                List<Node> hyperlinks = vbox.getChildren().stream().filter(e -> {
                    return e instanceof Hyperlink;
                }).collect(Collectors.toList());
                vbox.getChildren().removeAll(hyperlinks); // Remove the hyperlink
            }
            return colorPalette;
        }

    }

}

This will find and remove any Hyperlinks inside any VBoxes in the ColorPalette. Keep in mind that it will break if the structure of ColorPalette is changed, which is totally possible since it isn't public API.

How it looks: ColorPicker with Hyperlink removed

Matthew
  • 134
  • 1
  • 6
1

I avoided this problem by creating Menu object insead of MenuItem. It now looks like this: Screenshot

Mateusz Tapa
  • 31
  • 1
  • 5