【问题标题】:PropertySetter from Java Timing Framework doesn't work with my own propertiesJava Timing Framework 中的 PropertySetter 不适用于我自己的属性
【发布时间】:2011-12-04 13:15:37
【问题描述】:

我有一个使用 http://java.net/projects/timingframework/ 的 Timing Framework 的小班。代码如下:

class Kula extends JPanel {
private Animator an;
private int xp;
private int yp;
private Color kolor;

public Kula(int x, int y) {
    this.xp = x;
    this.yp = y;
    this.kolor = Color.RED;

    TimingTarget tt = PropertySetter.getTarget(this, "kolor", Color.RED, Color.BLUE);
    an = new Animator.Builder().setDuration(2, TimeUnit.SECONDS).addTarget(tt).build();
}

public Color getKolor() {
    return kolor;
}

public void setKolor(Color kolor) {
    this.kolor = kolor;
    repaint();
}

public Animator getAnimator() {
    return this.an;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(kolor);
    g.fillOval(xp, yp, 20, 20);
}
}

如您所见,它绘制了一个具有特定颜色和位置(xp 和 yp)的椭圆。 它也有一个动画师。在构造函数中,我创建了 Animator,但在创建 TimingTarget 之前使用线性插值器(默认)更改 kolor 变量。我有 getter 和 setter,但是当我启动我的动画师时,我得到了一个例外:

线程“AWT-EventQueue-0”中的异常 java.lang.IllegalStateException: (Timing Framework #31) 在 swingtest.GUI$Kula[,0,0,798x533,alignmentX=0.0,alignmentY 上反射调用 setKolor 方法时发生意外异常=0.0,边框=,标志=0,最大尺寸=,最小尺寸=,首选尺寸=]。 在 org.jdesktop.core.animation.timing.PropertySetter$PropertySetterTimingTarget.valueAtTimingEvent(PropertySetter.java:298) 在 org.jdesktop.core.animation.timing.KeyFramesTimingTarget.timingEvent(KeyFramesTimingTarget.java:51) 在 org.jdesktop.core.animation.timing.Animator.notifyListenersAboutATimingSourceTick(Animator.java:934) 在 org.jdesktop.core.animation.timing.Animator.timingSourceTick(Animator.java:1124) 在 org.jdesktop.core.animation.timing.TimingSource$1.run(TimingSource.java:183) 在 org.jdesktop.swing.animation.timing.sources.SwingTimerTimingSource$1.actionPerformed(SwingTimerTimingSource.java:75) 在 javax.swing.Timer.fireActionPerformed(Timer.java:312) 在 javax.swing.Timer$DoPostEvent.run(Timer.java:244) 在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 在 java.awt.EventQueue.access$000(EventQueue.java:101) 在 java.awt.EventQueue$3.run(EventQueue.java:666) 在 java.awt.EventQueue$3.run(EventQueue.java:664) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 原因:java.lang.IllegalAccessException:类 org.jdesktop.core.animation.timing.PropertySetter$PropertySetterTimingTarget 无法访问带有修饰符“public”的类 swingtest.GUI$Kula 的成员 在 sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 在 java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261) 在 java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253) 在 java.lang.reflect.Method.invoke(Method.java:594) 在 org.jdesktop.core.animation.timing.PropertySetter$PropertySetterTimingTarget.valueAtTimingEvent(PropertySetter.java:296) ... 21 更多

有趣的是,当我换行时:

TimingTarget tt = PropertySetter.getTarget(this, "kolor", Color.RED, Color.BLUE);

进入

TimingTarget tt = PropertySetter.getTarget(this, "background", Color.RED, Color.BLUE);

一切正常。我的面板的背景正确地改变了。

为什么我的 PropertySetter 不适用于 kolor 变量?

附:在波兰语中,“Kula”的意思是球体,“kolor”的意思是颜色

【问题讨论】:

    标签: java swing animation


    【解决方案1】:

    PropertySetter 通过反射访问目标的属性。只有当类和属性都具有 public 范围时,这才有可能。

    • 不可访问:“kolor”是包作用域类 Kula 中的公共方法
    • accessible:“background”是公共类Component中的公共方法

    解决方案是公开您的课程。

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 2020-12-02
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多