如何在不继承 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 来执行动画。我想要的是能够在 AWTSwing 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();

然而这并没有起到任何作用。我尝试过其他方法——例如使用自定义TimingTargets 或PropertySetters,但我没有任何运气。正确的做法是什么?

为了给这个问题提供更多的背景信息,这是我的javaQuery 库,它是 jQueryJava 的一个端口,并以我之前的项目为模型(带有工作动画)droidQuery.

【问题讨论】:

What is the correct approach。子类化 对于边界和颜色,组件没有这些方法吗? @Cruncher,他们确实这样做了——但我没有看到这些在动画中正常工作。有一个接受ColorsetBackground 方法和一个接受RectanglesetBounds 方法 - 但是我无法看到这些更新。 这可能取决于布局管理器。当 java 通过布局管理器使用所有东西时,像 setBounds 这样的东西可能只有在你使用 setLayout(null); 时才能工作; 你能告诉我们你为什么不想子类化吗? 【参考方案1】:

使用摇摆(或 JFX)。 AWT 是旧的且可定制性较低,因为它使用本机平台组件:将每个 Java AWT 组件与本机组件对等。

有边界我假设边界 您可以设置边框(甚至添加)和颜色。 setOpaque(false) 允许透明度。

永远不应该获取组件的图形。组件在明确定义的上下文中接收绘制事件:事件处理线程上的单线程、剪辑、定位等等。

所以使用组件的设置器,invalidate 如果需要. And possibly a repaint(50L)`。

【讨论】:

以上是关于如何在不继承 Java 组件的情况下更改其颜色或边界?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不绘制我自己的情况下更改 UIPopoverPresentationController 箭头颜色

如何在不渲染子组件的情况下根据子组件大小更改 React 父组件大小?

如何在不更改整个文本视图颜色的情况下更改文本颜色

如何在不更改 javafx 边框的情况下更改 TextField 的背景颜色?

如何在不刷新页面的情况下“连续”更改背景颜色[重复]

VIM:如何在不使用非文本颜色元素的情况下更改 Showbreak Highlight 颜色