2012-04-09 2 views
5

私は線形グラデーションを適用するために以下の例を試しました:GradientPaintDemo2DリニアグラデーションのJava Swing Matte Border?

でもうまく機能しますが、グラデーションカラーをJava Swingのマットボーダーに適用したいと思っていました。

javax.swing.BorderFactory.createMatteBorder(1, 50, 1, 50, color) 

しかし、それは唯一のColorのタイプではなく、GradientPaintを適用するためです:私はこれを試してみました。

私たちが知っているように、GradientPaintには、上記の例に示すように、2つの色が混在しています。では、この場合の代替回答は何ですか?

答えて

8

どのように新しいMatteBorder(int, int, int, int, javax.swing.Icon)

//Another example: 
import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 

public class GradientMatteBorderTest { 
    public JComponent makeUI() { 
    Icon icon = new Icon() { 
     @Override public void paintIcon(Component c, Graphics g, int x, int y) { 
     Graphics2D g2 = (Graphics2D)g.create(); 
     Point2D start = new Point2D.Float(0f, 0f); 
     Point2D end = new Point2D.Float(99f, 0f); 
     float[] dist = {0.0f, 0.5f, 1.0f}; 
     Color[] colors = { Color.RED, Color.YELLOW, Color.GREEN }; 
     g2.setPaint(new LinearGradientPaint(start, end, dist, colors)); 
     g2.fillRect(x, y, 100, 10); 
     g2.dispose(); 
     } 
     @Override public int getIconWidth() { return 100; } 
     @Override public int getIconHeight() { return 10; } 
    }; 
    JLabel label = new JLabel("GradientMatteBorder"); 
    label.setBorder(BorderFactory.createMatteBorder(10,5,10,0,icon)); 
    JPanel p = new JPanel(new BorderLayout()); 
    p.setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
    p.add(label, BorderLayout.NORTH); 
    return p; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new GradientMatteBorderTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
の使用について
10

このような場合は、独自の罫線を作成する必要があります。ここ
はグラデーションボーダークラスと例です:

public static class GradientBorder implements Border 
{ 
    private Insets margin; 

    public GradientBorder (int top, int left, int bottom, int right) 
    { 
     super(); 
     margin = new Insets (top, left, bottom, right); 
    } 

    public void paintBorder (Component c, Graphics g, int x, int y, int width, int height) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setPaint (new GradientPaint (x, y, Color.RED, x + width, y, Color.BLUE)); 

     Area border = new Area (new Rectangle (x, y, width, height)); 
     border.subtract (new Area (new Rectangle (x + margin.left, y + margin.top, 
       width - margin.left - margin.right, height - margin.top - margin.bottom))); 
     g2d.fill (border); 
    } 

    public Insets getBorderInsets (Component c) 
    { 
     return margin; 
    } 

    public boolean isBorderOpaque() 
    { 
     return true; 
    } 
} 

あなたは、色を他の勾配方向を指定することができますofcourseのe.t.c.コンストラクタに初期化を組み込むこともできます(必要な場合)。これを使用するにはあなただけ(任意のJComponentの後継で)境界線を設定する必要があります。

jComponent.setBorder (new GradientBorder (25, 50, 25, 50)); 

基本的には任意の着色/アニメーション/形状e.t.c.であなたがこの方法を好きな境界線を作成することができます

半透明の境界線を作成したい場合は - isBorderOpaque()メソッドがtrueを返す必要があります(半透明の色、丸みを帯びた角などで作成する場合)。そうしないと、コンポーネント再描画の問題。