【问题标题】:How can I change the color or bounds of a Java Component without subclassing it?如何在不继承 Java 组件的情况下更改其颜色或边界?
【发布时间】: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); 时才能工作;
  • 你能告诉我们你为什么不想子类化吗?

标签: java animation awt javaquery


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多