How to change or override the tooltip in JavaFX ColorPicker

后端 未结 2 1818
孤街浪徒
孤街浪徒 2020-12-22 12:27

I am using JavaFX ColorPicker in my application. As per my requirements, I have mapped the default colors on the color picker to a number. I want this number to be displaye

2条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-22 13:21

    This is really a hacky answer.

    The first problem: you have to find the popup node on the scene once it shows up. But you won't... since its not in the same window!

    Having a deep look at how ScenicView does it, the trick is getting the list of windows at that moment, but using a deprectated method:

    private PopupWindow getPopupWindow() {
        @SuppressWarnings("deprecation") final Iterator windows = Window.impl_getWindows();
        while (windows.hasNext()) {
            final Window window = windows.next();
            if (window instanceof PopupWindow) {
                return (PopupWindow)window;
            }
        }
        return null;
    }
    

    Once you have the popup window, we can now check for all the Rectangle nodes using lookupAll and the CSS selector color-rect, to get their color, and install the tooltip over its parent container:

    @Override
    public void start(Stage primaryStage) {
        ColorPicker picker = new ColorPicker();
        StackPane root = new StackPane(picker);
    
        Scene scene = new Scene(root, 500, 400);
    
        primaryStage.setScene(scene);
        primaryStage.show();
        picker.showingProperty().addListener((obs,b,b1)->{
            if(b1){
                PopupWindow popupWindow = getPopupWindow();
                Node popup = popupWindow.getScene().getRoot().getChildrenUnmodifiable().get(0);
                popup.lookupAll(".color-rect").stream()
                    .forEach(rect->{
                        Color c = (Color)((Rectangle)rect).getFill();
                        Tooltip.install(rect.getParent(), new Tooltip("Custom tip for "+c.toString()));
                    });
            }
        });
    }
    

    This is what it looks like:

    Color picker with custom tooltip

提交回复
热议问题