2

您好我正在尝试创建一个 Java 游戏并且需要在我的标签上添加一些效果。我有以下问题

  1. 如何为我的标签添加淡入/淡出效果。
  2. 我有一个 JLabel 但我需要一个形状,可能是一个矩形或云形。我怎样才能做到这一点?
4

1 回答 1

12

您可以使用 aAlphaComposite更改组件的不透明度级别...

现在,通过巧妙地使用计时器,您可以使标签淡入淡出或简单地控制不透明度...

在此处输入图像描述

public class TestFadeLabel {

    public static void main(String[] args) {
        new TestFadeLabel();
    }

    public TestFadeLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        private float direction = -0.05f;
        private FadeLabel label = new FadeLabel();

        public MainPane() {
            setLayout(new BorderLayout());
            JLabel background = new JLabel();
            background.setLayout(new GridBagLayout());
            try {
                background.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Storm.jpg"))));
            } catch (Exception e) {
                e.printStackTrace();
            }
            add(background);

            label = new FadeLabel();
            background.add(label);

            Timer timer = new Timer(100, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    float alpha = label.getAlpha();
                    alpha += direction;
                    if (alpha < 0) {
                        alpha = 0;
                        direction = 0.05f;
                    } else if (alpha > 1) {
                        alpha = 1;
                        direction = -0.05f;
                    }
                    label.setAlpha(alpha);
                }
            });
            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();
        }
    }

    public class FadeLabel extends JLabel {

        private float alpha;
        private BufferedImage background;

        public FadeLabel() {
            try {
                background = ImageIO.read(getClass().getResource("/Cloud.png"));
            } catch (Exception e) {
            }
            setText("Hide and go seek");
            setHorizontalAlignment(CENTER);
            setVerticalAlignment(CENTER);
            setAlpha(1f);
        }

        public void setAlpha(float value) {
            if (alpha != value) {
                float old = alpha;
                alpha = value;
                firePropertyChange("alpha", old, alpha);
                repaint();
            }
        }

        public float getAlpha() {
            return alpha;
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        public void paint(Graphics g) {
            // This is one of the few times I would directly override paint
            // This makes sure that the entire paint chain is now using
            // the alpha composite, including borders and child components
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getAlpha()));
            super.paint(g2d);
            g2d.dispose();
        }

        @Override
        protected void paintComponent(Graphics g) {
            // This is one of the few times that doing this before the super call
            // will work...
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);
            }
            super.paintComponent(g);
        }
    }
}
于 2012-11-02T22:13:39.260 回答