【问题标题】:Java Swing: Rainbow border for a JComponentJava Swing:JComponent 的彩虹边框
【发布时间】:2017-06-03 22:19:24
【问题描述】:

我目前正在为游戏设计标题画面。在设计徽标时,我决定在边缘使用彩虹边框:

我想在此之后我想在标题屏幕上实现我的其余组件,并使用类似的彩虹边框(特别是 JButtons)。在寻找方法时,我遇到了AbstractBorder 类。我的问题是,这甚至可以做到吗?如果可以,使用抽象边框类根据组件的大小生成彩虹边框的最有效方法是什么?

【问题讨论】:

    标签: java swing border


    【解决方案1】:

    基本的做法是用LinearGradientPaint来画彩虹效果,比如……

    public class RainbowBorder extends AbstractBorder {
    
        @Override
        public Insets getBorderInsets(Component c, Insets insets) {
            insets.bottom = insets.top = insets.left = insets.right = 1;
            return insets;
        }
    
        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            Graphics2D g2d = (Graphics2D) g.create();
            LinearGradientPaint lpg = new LinearGradientPaint(
                new Point(x, y),
                new Point(x, y + height),
                new float[]{0.0f, 0.25f, 0.5f, 0.75f, 1.0f},
                new Color[]{Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA});
            g2d.setPaint(lpg);
            g2d.draw(new Rectangle2D.Double(x, y, width - 1, height - 1));
            g2d.dispose();
        }
    
    }
    

    作为概念证明

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.LinearGradientPaint;
    import java.awt.Point;
    import java.awt.geom.Rectangle2D;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.AbstractBorder;
    import javax.swing.border.CompoundBorder;
    import javax.swing.border.EmptyBorder;
    
    public class TextOutline {
    
        public static void main(String[] args) {
            new TextOutline();
        }
    
        public TextOutline() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class RainbowBorder extends AbstractBorder {
    
            @Override
            public Insets getBorderInsets(Component c) {
                return super.getBorderInsets(c); //To change body of generated methods, choose Tools | Templates.
            }
    
            @Override
            public Insets getBorderInsets(Component c, Insets insets) {
                insets.bottom = insets.top = insets.left = insets.right = 1;
                return insets;
            }
    
            @Override
            public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
                Graphics2D g2d = (Graphics2D) g.create();
                LinearGradientPaint lpg = new LinearGradientPaint(
                    new Point(x, y),
                    new Point(x, y + height),
                    new float[]{0.0f, 0.25f, 0.5f, 0.75f, 1.0f},
                    new Color[]{Color.YELLOW,    Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA});
                g2d.setPaint(lpg);
                g2d.draw(new Rectangle2D.Double(x, y, width - 1, height - 1));
                g2d.dispose();
            }
    
        }
    
        class TestPane extends JPanel {
    
            public TestPane() {
                setLayout(new BorderLayout());
                setBorder(
                    new CompoundBorder(
                        new EmptyBorder(10, 10, 10, 10),
                        new CompoundBorder(
                            new RainbowBorder(), 
                            new EmptyBorder(10, 10, 10, 10))
                ));
                add(new JLabel("Rainbow and unicorns"));
            }
        }
    }
    

    【讨论】:

    • 令人难以置信的示例和代码,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多