2012-04-09 4 views
5

Ho provato il seguente esempio per applicare un gradiente lineare: GradientPaintDemo2D.Bordo opaco di swing Java con gradiente lineare?

Funziona bene, ma volevo che il colore sfumato fosse applicato al bordo opaco Java Swing. Ho provato questo:

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

Ma questo è solo per l'applicazione di uno tipo di Color, non GradientPaint.

Come tutti sappiamo, GradientPaint contiene due colori completamente miscelati, come mostrato nell'esempio collegato sopra. Quindi qual è la risposta alternativa per questo caso?

risposta

8

Come sull'utilizzo nuova 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

Per questo caso specifico è necessario creare il proprio bordo.
Ecco un esempio con classe di gradiente di frontiera:

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

Naturalmente è possibile specificare qualsiasi altra direzione del gradiente, colori e.t.c. Puoi anche inserire la loro inizializzazione in costruttore (se ne hai bisogno). Per usarlo è sufficiente impostare confine (in qualsiasi successore JComponent):

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

In pratica è possibile creare qualsiasi confine ti piace questo modo con qualsiasi colorazione/animazione/forme e.t.c.

E tra l'altro - isBorderOpaque() metodo deve restituire true, se si desidera creare confine semi-trasparente (ad esempio, con i colori semi-trasparenti, a forma di angolo arrotondato e simili), altrimenti si avrà a che fare con problemi di riverniciatura dei componenti.