java-为什么graphics.drawString()不重画?

java-为什么graphics.drawString()不重画?,java,user-interface,swing,Java,User Interface,Swing,我无法原谅,已经很晚了。我正在子类化一个WindowsSliderUI,因为我想让它画一个更大的拇指,这是正确的词吗?这是有效的,并且在它上面显示滑块的值,例如,gtk look and feel Does,这是坏的。我正在覆盖paint方法,目前看起来是这样的:很长,我的更改接近底部: Rectangle knobBounds = thumbRect; int w = knobBounds.width; int h = knobBounds.height;

我无法原谅,已经很晚了。我正在子类化一个WindowsSliderUI,因为我想让它画一个更大的拇指,这是正确的词吗?这是有效的,并且在它上面显示滑块的值,例如,gtk look and feel Does,这是坏的。我正在覆盖paint方法,目前看起来是这样的:很长,我的更改接近底部:

Rectangle knobBounds = thumbRect;
        int w = knobBounds.width;
        int h = knobBounds.height;      

        g.translate(knobBounds.x, knobBounds.y);

        if ( slider.isEnabled() ) {
            g.setColor(slider.getBackground());
        }
        else {
            g.setColor(slider.getBackground().darker());
        }

    Boolean paintThumbArrowShape =
        (Boolean)slider.getClientProperty("Slider.paintThumbArrowShape");

    if ((!slider.getPaintTicks() && paintThumbArrowShape == null) ||
        paintThumbArrowShape == Boolean.FALSE) {

        // "plain" version
            g.fillRect(0, 0, w, h);

            //THE ONES THAT MATTER
            g.setColor(Color.BLACK);
            String val = slider.getValue()+"";
            g.drawString(val, 0, 0);
            g.setColor(Color.RED);
            g.drawLine(0, 0, 30, 8);
            //END

            g.setColor(Color.black);
            g.drawLine(0, h-1, w-1, h-1);    
            g.drawLine(w-1, 0, w-1, h-1);    

            g.setColor(getHighlightColor());
            g.drawLine(0, 0, 0, h-2);
            g.drawLine(1, 0, w-2, 0);

            g.setColor(getShadowColor());
            g.drawLine(1, h-2, w-2, h-2);
            g.drawLine(w-2, 1, w-2, h-3);
        }
我只想得到显示在拇指上方的值。但是,现在发生的情况是字符串最初显示,但当我拖动滑块时,它保持在同一位置,直到我释放鼠标按钮,它才会改变值,此时它会在正确的位置用正确的值重新绘制。为了让我的头更有趣,drawLine方法很好用——当我拖动它时,线总是在拇指上。 现在,这可能是一个小错误,我真的很不好,很累,但请帮我找到它。请注意,如果你看到解决整个问题的更好方法,也请告诉我。正如我所说的,我真的不擅长这个,我倾向于把事情弄得更复杂


非常感谢

我不知道完整的答案,但是你打电话给

 g.drawString(val, 0, 0);
看起来很狡猾。指定给drawString的坐标是字符串中最左侧字符的基线,而不是字符串的左上角。通常,像您这样的调用不会显示任何内容,因为所有或大部分字符串都是在剪切矩形之外绘制的

也许你的意思是这样的:

    final int height = g.getFontMetrics().getAscent();
    g.drawString(s, 0, height);

我不知道完整的答案,但是你打电话给

 g.drawString(val, 0, 0);
看起来很狡猾。指定给drawString的坐标是字符串中最左侧字符的基线,而不是字符串的左上角。通常,像您这样的调用不会显示任何内容,因为所有或大部分字符串都是在剪切矩形之外绘制的

也许你的意思是这样的:

    final int height = g.getFontMetrics().getAscent();
    g.drawString(s, 0, height);