2012-04-09 26 views
5

Doğrusal bir degrade uygulamak için aşağıdaki örneği denedim: GradientPaintDemo2D.Doğrusal Degrade ile Java Swing Mat Sınırı?

İyi çalışıyor, ancak Java Swing mat sınırına uygulanacak degrade rengini istedim.

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

Ama bu sadece Color arasında biri türü değil, GradientPaint uygulamak için var: Bu çalıştı.

Hepimizin bildiği gibi, GradientPaint, yukarıda bağlanmış olan örnekte gösterildiği gibi tamamen karıştırılmış iki renk içerir. Peki bu dava için alternatif cevap nedir?

cevap

8

Nasıl yeni 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); 
    } 
} 
kullanma hakkında
10

Böyle özel bir durum için kendi Kenarlığınızı oluşturmanız gerekir.
İşte degrade sınır sınıfı ile bir örnektir:

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; 
    } 
} 

Tabii sen, renkleri başka degrade yönünü belirleyebilir e.t.c. Başlatmalarını yapıcıya (varsa) koyabilirsiniz. Bunu kullanmak için (herhangi bir JComponent halefi olarak) sınırı ayarlamak gerekir sadece olacaktır:

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

Temel olarak herhangi bir renklendirme/animasyon/şekillerle bu yol gibi herhangi bir sınır oluşturabilir e.t.c.

Ve bu arada - isBorderOpaque() yöntemi, yarı saydam kenarlık oluşturmak istiyorsanız (örneğin, yarı saydam renklerle, örneğin yuvarlak köşeli ve benzer şekilde), aksi takdirde, aşağıdakileri yapmanız gerekir. bileşen repainting sorunları.