java - 淡化 JLabels 的方法?
问题描述
我在制作游戏时遇到问题。我正在尝试使用计时器淡化 JLabel。到目前为止,我已经能够将 JLabel 设置为透明,并且我已经能够制作一个工作定时器。但不知何故,我无法将它们结合在一起。我可以将 JLabel 的背景设置为
l.setBackground(new Color(0, 0, 0, 200));
(当然,我希望 JLabel 改变颜色)并且它有效。JLabel 是透明的。但是我无法将其放入计时器中以使颜色变淡:
public static void fadeLabel(JLabel lab, int steps, int target) {
class fade extends Thread {
public void run() {
Timer t = new Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(lab.getBackground().getAlpha());
lab.setBackground(new
Color(lab.getBackground().getRed(),
lab.getBackground().getGreen(),
lab.getBackground().getBlue(),
lab.getBackground().getAlpha() + steps));
if (lab.getBackground().getAlpha() == target) {
((Timer) e.getSource()).stop();
}
}
});
t.start();
}
}
new Thread(new fade()).start();
}
相反,它只是从黑色变为透明。中间什么都没有。它也会抛出错误java.lang.IllegalArgumentException: Color parameter outside of expected range: Alpha
。但是,我已将步长设置为 -5(在这种情况下,它淡出的速率,因为它是负数),如果您还记得,我将 alpha 设置为可被 5 整除的值,我也有一个检查器何时到达目标,以便在到达该目标时停止计时器。有什么我做错了吗?JLabel 的背景更新太快而无法显示?任何帮助都会很棒。
编辑:我已经修复了java.lang.IllegalArgumentException: Color parameter outside of expected range: Alpha
. 但是关于 JLabel 不褪色的另一个问题仍然存在,我不知道如何修复它。
解决方案
我没有直接回答你的问题。A写了一些代码,看看:D
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MyWindow extends JFrame {
public MyWindow() {
initComponents();
}
private void initComponents() {
setTitle( "Fading labels :)" );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize( 400, 400 );
setLocationRelativeTo( null );
setLayout( new FlowLayout() );
for ( int i = 0; i < 550; i++ ) {
JLabel lab = new JLabel( "x" );
add( lab );
fadeLabel( lab, 10, i / 10, 0 );
}
}
private void fadeLabel( JLabel label, int steps, int skipSteps, int targetAlpha ) {
new LabelFader( label, steps, skipSteps, targetAlpha ).start();
}
private class LabelFader {
JLabel label;
int steps;
int skipSteps;
int targetAlpha;
LabelFader( JLabel label, int steps, int skipSteps, int targetAlpha ) {
this.label = label;
this.steps = steps;
this.skipSteps = skipSteps;
this.targetAlpha = targetAlpha;
}
void start() {
Color startColor = label.getForeground();
int startAlpha = startColor.getAlpha();
int deltaAlpha = startAlpha - targetAlpha;
if ( deltaAlpha > 0 ) {
int alphaStep = deltaAlpha / steps;
new Thread( new Runnable() {
@Override
public void run() {
int totalIterations = steps + skipSteps;
int currIteration = 1;
for ( int i = 0; i < totalIterations; i++ ) {
if ( skipSteps == 0 ) {
int newAlpha = startAlpha - alphaStep * currIteration++;
newAlpha = newAlpha < 0 ? 0 : newAlpha;
Color newColor = new Color(
startColor.getRed(),
startColor.getGreen(),
startColor.getGreen(),
newAlpha );
label.setForeground( newColor );
} else {
skipSteps--;
}
try {
Thread.sleep( 100 );
} catch ( InterruptedException exc ) {
exc.printStackTrace();
}
}
Color newColor = new Color(
startColor.getRed(),
startColor.getGreen(),
startColor.getGreen(),
targetAlpha );
label.setForeground( newColor );
}
}).start();
}
}
}
public static void main( String[] args ) {
EventQueue.invokeLater( new Runnable() {
public void run() {
new MyWindow().setVisible( true );
}
});
}
}
推荐阅读
- android - 如何在 ConstraintLayout 中设置视图可见性?
- r - 遍历一个列表,同时对另一个列表进行采样
- android - 仅用于测试依赖项的 Gradle 模块输出配置
- javascript - 如何将空数组分配给javascript中的动态属性?
- java - 来自线程的进程、线程和方法调用 - 它们与堆栈的关系
- powershell - 如何处理 PowerShell 脚本中的 tf.exe 错误
- git - 为什么 git diff 与 git diff --staged 下的输出不同?
- java - 如何简化移动多个项目?
- android - 在 CoordinatorLayout 中使用带有 behavior_overlapTop 的浮动操作按钮
- javascript - jQuery UI 日期选择器 - 通过单击另一个按钮更改范围