在我从my previous question学到的东西之后,我想在按下时使用纹理在扩展的JButton上绘制文本。第一步是设置按钮的ChangeListener和stateChanged方法;我有这些工作,可以在方法中设置前景色,这样当按钮被按下时文本将是一种颜色而另一种则不是。
在此基础上,我用我用于toggleButtons的drawString代码替换了setForeground调用。它可以正常工作,但是在绘制文本之后,它会被自动重新绘制的按钮覆盖。我尝试在“while(model.isPressed())”循环中抛出代码,但这有一些非常可怕的结果(系统挂起)。我将如何手动重新绘制我的按钮,以便只在stateChanged方法中重绘它?
答案 0 :(得分:2)
在我看来,你是以错误的方式改变按钮的外观。我认为你可以更容易地创建一个能够处理按钮外观的类,而不是在按钮代码中手动处理按钮的绘图参数。阻止repaint()
来电并不是真正的方法我相信你的情况。
我个人会创建自己的ButtonUI
实现来处理所有绘制规则(例如基于按钮状态的前景颜色),然后我会调用按钮上的setUI
,指定一个实例这个新的ButtonUI
作为参数。如果您不想处理所有绘图内容,您可以随时使用新类作为按钮已有的UI处理程序的代理(通过JButton的getUI()
方法),并仅在需要时进行更改(我自己没有测试过,但我很确定它能正常工作。
当然,这代表了更多的编码,但它会在单个类中本地化您的外观和感觉处理,并且它适合Swing的工作方式。网络上有一些资源可以帮助您入门(here,here和here)。