首页 > 解决方案 > 淡化 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 不褪色的另一个问题仍然存在,我不知道如何修复它。

标签: javaswingtransparencyjlabel

解决方案


我没有直接回答你的问题。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 );
            }
        });
    }

}

推荐阅读