2017-06-03 76 views
0

我目前正在设计游戏的标题屏幕。在设计的标志,我决定与彩虹边框去周围的边缘:Java Swing:JComponent的彩虹边框

enter image description here

我在此之后想通我想实现我的部件的标题画面上休息了类似彩虹的边界(具体Jbutton将)。在寻找方法时,我遇到了AbstractBorder课。我的问题是,这甚至有可能做到这一点,如果是这样,根据组件大小使用Abstract Border类生成彩虹边框的最有效方法是什么?

回答

5

的基本方法是使用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(); 
    } 

} 

而作为一个概念证明

Rainbows and unicorns

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")); 
     } 
    } 
} 
+0

难以置信的例子,代码,非常感谢您的帮助! –