2012-04-09 2 views
5

Я попробовал следующий пример применения линейного градиента: GradientPaintDemo2D.Java Swing Matte Border с линейным градиентом?

Он работает хорошо, но я хотел, чтобы цвет градиента применялся в рамки Java Swing matte. Я попытался это:

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

Но это только для применения один типа Color, не GradientPaint.

Как мы все знаем, GradientPaint содержит два цвета, смешанные в целом, как показано в примере, приведенном выше. Итак, каков альтернативный ответ на этот случай?

ответ

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, если вы хотите создать полупрозрачную рамку (например, с полупрозрачными цветами, сформированными с закругленным углом и т. Д.), Иначе вам придется иметь дело с проблемы перекраски компонентов.

Смежные вопросы