如何在不继承 Java 组件的情况下更改其颜色或边界?
Posted
技术标签:
【中文标题】如何在不继承 Java 组件的情况下更改其颜色或边界?【英文标题】:How can I change the color or bounds of a Java Component without subclassing it? 【发布时间】:2013-09-13 05:16:21 【问题描述】:我正在使用 Java timing framework 来执行动画。我想要的是能够在 AWT
或 Swing
Component 上执行一些动画,而无需对其进行子类化。我感兴趣的动画包括更改边界、颜色或 alpha。网上有很多关于如何子类化Component
,然后重写paint(Graphics)
方法以执行此类更改的示例,但是我想找到一种不同的方法。
我尝试通过调用获取Component
的图形
Graphics2D g2d = (Graphics2D) component.getGraphics();
然后对其进行操作——比如设置 alpha 值:
AlphaComposite newComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, newVal);
g2d.setComposite(newComposite);
component.repaint();
然而这并没有起到任何作用。我尝试过其他方法——例如使用自定义TimingTarget
s 或PropertySetter
s,但我没有任何运气。正确的做法是什么?
为了给这个问题提供更多的背景信息,这是我的javaQuery 库,它是 jQuery 到 Java 的一个端口,并以我之前的项目为模型(带有工作动画)droidQuery.
【问题讨论】:
What is the correct approach
。子类化
对于边界和颜色,组件没有这些方法吗?
@Cruncher,他们确实这样做了——但我没有看到这些在动画中正常工作。有一个接受Color
的setBackground
方法和一个接受Rectangle
的setBounds
方法 - 但是我无法看到这些更新。
这可能取决于布局管理器。当 java 通过布局管理器使用所有东西时,像 setBounds 这样的东西可能只有在你使用 setLayout(null); 时才能工作;
你能告诉我们你为什么不想子类化吗?
【参考方案1】:
使用摇摆(或 JFX)。 AWT 是旧的且可定制性较低,因为它使用本机平台组件:将每个 Java AWT 组件与本机组件对等。
有边界我假设边界
您可以设置边框(甚至添加)和颜色。 setOpaque(false)
允许透明度。
永远不应该获取组件的图形。组件在明确定义的上下文中接收绘制事件:事件处理线程上的单线程、剪辑、定位等等。
所以使用组件的设置器,invalidate
如果需要. And possibly a
repaint(50L)`。
【讨论】:
以上是关于如何在不继承 Java 组件的情况下更改其颜色或边界?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不绘制我自己的情况下更改 UIPopoverPresentationController 箭头颜色
如何在不渲染子组件的情况下根据子组件大小更改 React 父组件大小?