这超出了我(原谅,已经晚了)。我将WindowsSliderUI划分为子类,因为我希望它绘制一个更大的拇指(这是正确的单词吗?)(正在运行),并且还在其上方显示滑块的值(例如gtk外观确实)(坏了)。我覆盖了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);
关于java - java-为什么graphics.drawString()不重绘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1376759/