Fading a JLabel that contains html

余生长醉 提交于 2019-12-11 08:54:22

问题


I can fade out a normal JLabel using a Timer, as follows:

 public static void main(String[] args) {
        JFrame frame = new JFrame();
//        final JLabel label = new JLabel("<html><font color=red>Red</font><font color=blue>Blue</font>");
        final JLabel label = new JLabel("Hello");
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        frame.getContentPane().add(label);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        final Timer timer = new Timer(100, null);

        final int steps = 25;

        timer.addActionListener(new ActionListener() {
            int count = 0;

            public void actionPerformed(ActionEvent e) {
                if (count <= steps) {
                    float intensity = count / (float) steps;
                    label.setForeground(new Color(intensity, intensity, intensity));
                    count++;
                } else {
                    timer.stop();
                }
            }
        });
        timer.start();
    } 

How can I make this also work with a JLabel that contains html, as per the commented-out line?

 final JLabel label = new JLabel("<html><font color=red>Red</font><font color=blue>Blue</font>");

回答1:


I got out my copy of "Filthy Rich Clients" and read up on using composites. My solution is to make a subclass of JLabel, as follows:

    import javax.swing.*;
    import java.awt.*;

    public class FadeableLabel extends JLabel {

        private float intensity = 1.0f;

        public FadeableLabel() {
        }

        public void setIntensity(float intensity) {
            this.intensity = intensity;
            repaint();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            final Composite oldComposite = g2.getComposite();
            g2.setComposite(AlphaComposite.SrcOver);
            final Color c = getBackground();
            final Color color = new Color(c.getRed(), c.getGreen(), c.getBlue(), (int) (255 * (1.0f - intensity)));
            g2.setColor(color);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setComposite(oldComposite);
        }
    }



回答2:


You must fade the HTML:

float intensity = count / (float) steps;
String color = String.format("%02x" % 255*intensity);
label.setText("<html><font color='#FF"+color+color+"'>Red</font>...");


来源:https://stackoverflow.com/questions/1531494/fading-a-jlabel-that-contains-html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!