Java 将JButton重新绘制限制为状态更改?

Java 将JButton重新绘制限制为状态更改?,java,swing,jbutton,repaint,Java,Swing,Jbutton,Repaint,在我从中学到了什么之后,我想在按下扩展的JButton时使用纹理在其上绘制文本。第一步是设置按钮的ChangeListener和stateChanged方法;我有这些工作,并可以在方法中设置前景色,这样文本将是一种颜色,而按钮按下时,另一种,而不是 在此基础上,我将setForeground调用替换为用于切换按钮的抽绳代码。它可以工作,但在绘制文本后,它会立即被自动重新绘制的按钮覆盖。我尝试将代码放入“while(model.isPressed())”循环,但结果非常糟糕(系统挂起)。如何手动重

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


在此基础上,我将setForeground调用替换为用于切换按钮的抽绳代码。它可以工作,但在绘制文本后,它会立即被自动重新绘制的按钮覆盖。我尝试将代码放入“while(model.isPressed())”循环,但结果非常糟糕(系统挂起)。如何手动重新绘制按钮,以便仅在stateChanged方法期间重新绘制?

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

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


当然,这对您来说意味着更多的编码,但它将在单个类中本地化您的外观和感觉处理,并且适合Swing的工作方式。网络上有一些资源可以帮助您开始(,和)。

您的问题是理论性的,请发布代码,说明您与JButton之间的问题,格式为My JButton正在做它应该做的事情;我只是想征求一些想法,因为我不确定如何进行我想进行的修改。+1但是
ButtonUI
将是
Laf
(不包括Windows本机操作系统)sensitive@mKorbel如果您仅将其用作代理,并在
UIDefaults
类中定义一些默认值,则不会使用,或任何其他指定颜色方案的方法。但你确实需要小心,这样你的应用程序在其他外观上就不会显得愚蠢了(如果它是你应用程序中的一个问题的话);我以前从未深入研究过ButtonUI,但我会看看链接,稍后再发回来这正是我想要的;我继续将切换按钮的绘图代码移动到自定义UI中,这样我就不再需要子类了。谢谢