限制JButton重绘为状态更改?

时间:2011-11-18 20:26:16

标签: java swing jbutton repaint

在我从my previous question学到的东西之后,我想在按下时使用纹理在扩展的JButton上绘制文本。第一步是设置按钮的ChangeListener和stateChanged方法;我有这些工作,可以在方法中设置前景色,这样当按钮被按下时文本将是一种颜色而另一种则不是。

在此基础上,我用我用于toggleButtons的drawString代码替换了setForeground调用。它可以正常工作,但是在绘制文本之后,它会被自动重新绘制的按钮覆盖。我尝试在“while(model.isPressed())”循环中抛出代码,但这有一些非常可怕的结果(系统挂起)。我将如何手动重新绘制我的按钮,以便只在stateChanged方法中重绘它?

1 个答案:

答案 0 :(得分:2)

在我看来,你是以错误的方式改变按钮的外观。我认为你可以更容易地创建一个能够处理按钮外观的类,而不是在按钮代码中手动处理按钮的绘图参数。阻止repaint()来电并不是真正的方法我相信你的情况。

我个人会创建自己的ButtonUI实现来处理所有绘制规则(例如基于按钮状态的前景颜色),然后我会调用按钮上的setUI,指定一个实例这个新的ButtonUI作为参数。如果您不想处理所有绘图内容,您可以随时使用新类作为按钮已有的UI处理程序的代理(通过JButton的getUI()方法),并仅在需要时进行更改(我自己没有测试过,但我很确定它能正常工作。

当然,这代表了更多的编码,但它会在单个类中本地化您的外观和感觉处理,并且它适合Swing的工作方式。网络上有一些资源可以帮助您入门(hereherehere)。