[編集: 今のところ、スイング タイマーを使用して独自のソリューションを手動で作成することになりました。これは、私のニーズに対して問題なく機能しているようです。私はまだパフォーマンスについて心配しており、誰かが以下の解決策を提案できる場合は、トライデントを支持して私の解決策を捨てても構わないと思っています. オンラインで調べてみると、トライデントがまだプロジェクトとして「生きている」かどうか疑問に思っています。注意: TimingFramework も試しましたが、自分のコードと比較して利点は見られませんでした。]
私はバックエンドの Java プログラミングには慣れていますが、GUI 側には不慣れで、Trident ライブラリはまったく初めてです。私たちの要件は、独立してフェードインおよびフェードアウトする多数のラベルを用意することです。そのため、すべてを手作業でコーディングするよりも、ライブラリを使用してこれを実現したいと考えています。
以下のテスト コードは、問題を再現します。TTGui が実行され、"HELLO WORLD" というラベルを追加するメソッドが呼び出されます。このメソッドは、Trident にラベルのアルファをアニメーション化するように要求します。TTLabel は、これを実現するために (およびその他の理由で) JLabel をサブクラス化します。
メインクラス:
import java.awt.*;
import javax.swing.*;
import org.pushingpixels.trident.Timeline;
public class TTGui extends JFrame
{
private Container pane;
public static void main(String[] args){
TTGui gui = new TTGui();
gui.addText("HELLO WORLD", 100);
while (true) {
}
}
public TTGui() {
this.setExtendedState(Frame.MAXIMIZED_BOTH);
pane = getContentPane();
pane.setBackground(Color.WHITE);
pane.setLayout(null);
setVisible(true);
}
public void addText(String text, int size){
TTLabel label = new TTLabel(text, size, 50, 50);
pane.add(label);
pane.repaint();
Timeline rolloverTimeline = new Timeline(label);
rolloverTimeline.addPropertyToInterpolate("alpha", 0.0, 1.0);
rolloverTimeline.setDuration(2500);
rolloverTimeline.play();
}
}
ラベルのサブクラス:
import java.awt.AlphaComposite;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.SwingConstants;
public class TTLabel extends javax.swing.JLabel {
private float alpha = 0;
public TTLabel(String str, int size, int x, int y){
super(str, SwingConstants.RIGHT);
this.setFont(new Font(this.getName(), Font.PLAIN, size));
this.setBounds(x, y, this.getPreferredSize().width, this.getPreferredSize().height);
}
public float getAlpha(){
return alpha;
}
public void setAlpha(float alpha){
this.alpha = alpha;
repaint();
}
protected void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
super.paintComponent(g);
}
}
現在の問題は、Trident がイベントをディスパッチするたびにエラーが繰り返されることです。
Exception occurred in updating field 'alpha' of object tridentTest.TTLabel at timeline position 1.0
java.lang.RuntimeException: Unable to set the value of the field 'alpha'
at org.pushingpixels.trident.TimelinePropertyBuilder$DefaultPropertySetter.set(TimelinePropertyBuilder.java:75)
at org.pushingpixels.trident.TimelinePropertyBuilder$GenericFieldInfo.updateFieldValue(TimelinePropertyBuilder.java:368)
at org.pushingpixels.trident.Timeline$Setter.onTimelineStateChanged(Timeline.java:143)
at org.pushingpixels.trident.Timeline$Chain$1.run(Timeline.java:207)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.pushingpixels.trident.TimelinePropertyBuilder$DefaultPropertySetter.set(TimelinePropertyBuilder.java:73)
... 17 more
paintComponent の内容が正しくない可能性があることは認識していますが、コンパイルされ、デバッグモード (Eclipse) ではメソッドが呼び出されないようです。ですから、私が持っているものについてアドバイスがあればありがたいのですが、現在の主な問題はエラーです。
これは StackOverflow への私の最初の投稿です。この質問を改善できる方法があれば教えてください。