【问题标题】:Limit JButton repaint to state changes?将 JButton 重绘限制为状态更改?
【发布时间】:2011-11-19 04:56:02
【问题描述】:

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

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

【问题讨论】:

  • 您的问题处于高理论水平,请在sscce.org 表单中发布证明您的 JButton 问题的代码
  • 我的 JButton 正在做它应该做的事情;我只是在征求意见,因为我不确定如何进行我想要进行的修改。

标签: java swing jbutton repaint


【解决方案1】:

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

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

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

【讨论】:

  • +1 但ButtonUILaf(不包括Windows Native OS)敏感
  • @mKorbel 如果您仅将其用作代理,并在 UIDefaults 类中定义一些默认值,或者以任何其他方式指定您的配色方案,则不会。但是您确实需要小心,以免您的应用程序在其他外观和感觉上看起来很傻(如果它在您的应用程序中是一个问题)。
  • 感谢您的建议;我以前从未深入研究过 ButtonUI,但我会看一下链接并稍后回复
  • 这正是我想要的;我继续将切换按钮的绘图代码也移动到自定义 UI 中,这样我就不再需要子类了。谢谢!
猜你喜欢
  • 2017-08-03
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多