Java Swing JSlider(垂直)更改thumbRect会弄乱滑块控件

Java Swing JSlider(垂直)更改thumbRect会弄乱滑块控件,java,swing,jslider,Java,Swing,Jslider,我试图覆盖paintThumb以显示图形滑块拇指。只要我不弄乱图像的大小,让它根据拇指的现有大小进行绘制,拇指图像和滑块就可以正常工作。如果我更改了thumbRect或图像的大小,我将无法抓取thumb或移动滑块不再工作。这是一个垂直滑道 注意:感谢垃圾神提供的解决方案。请参见代码中的内容。 注2:已更新为可接受的工作示例。 注3:最初的问题是由于在paintThumb内调整大小引起的 这是滑块: sliders[channel].setUI(new customSliderHandle(sli

我试图覆盖paintThumb以显示图形滑块拇指。只要我不弄乱图像的大小,让它根据拇指的现有大小进行绘制,拇指图像和滑块就可以正常工作。如果我更改了thumbRect或图像的大小,我将无法抓取thumb或移动滑块不再工作。这是一个垂直滑道

注意:感谢垃圾神提供的解决方案。请参见代码中的内容。
注2:已更新为可接受的工作示例。
注3:最初的问题是由于在paintThumb内调整大小引起的

这是滑块:

sliders[channel].setUI(new customSliderHandle(sliders[channel], busType));
下面是课程:

private static class customSliderHandle extends BasicSliderUI {

    String sBusType;
    Image image;

    public customSliderHandle(JSlider slider, String busType) {
        super(slider);

        sBusType = busType;

        try {
            if(sBusType.equals("ch")) {
                //noinspection ConstantConditions
                image = ImageIO.read(getClass().getClassLoader().getResource("web/images/black-slider.png"));
            } else {
                //noinspection ConstantConditions
                image = ImageIO.read(getClass().getClassLoader().getResource("web/images/yellow-slider.png"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void calculateThumbSize() {
        super.calculateThumbSize();

        //// Fixed!!!
        thumbRect.setSize(20, 40);
    }

    @Override
    public void paintThumb(Graphics g) {

        ///// This was the original problem. Move into
        ///// calculateThumbSize() resolved the problem.
        ///// thumbRect.setSize(20, 40);

        int x = thumbRect.x;
        int y = thumbRect.y;
        int width = thumbRect.width;
        int height = thumbRect.height;
        g.drawImage(image, x, y, width, height, null);
    }
}

调用
paintThumb()
时,已经根据
getThumbSize()
的结果计算了
thumbRect
。此外,由于其未知的延迟,您不应该在
paint()
内部调用
ImageIO.read()
。相反,可以异步加载映像,如图所示使用
SwingWorker
,并在实现
getThumbSize()
时使用映像的维度。请注意,如果您的
图像
不是正方形,您应该考虑
getOrientation()
的结果。

我非常感谢您的帮助!我刚刚将thumbRect.setSize(20,40)放在calculateThumbSize()覆盖中,它成功了。不确定如何简化图像处理,但这肯定是答案。如果我将ImageIO从paintThumb移到父方法(customSliderHandle)中,并将声明放入类中(就像我对sBusType所做的那样),我将更新我的OPI。这样可以吗?@JohnSmith:在构造函数中传递引用听起来不错。