Java Swing Matte Border with linear gradient?

I tried the following example of application of a linear gradient: GradientPaintDemo2D.

It works well, but I wanted the gradient color to be applied in the matte border of Java Swing. I tried this:

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

But this is only for the application of one type Color, not GradientPaint.

As we all know, GradientPaintcontains two colors mixed in general, as shown in the example above. So what is the alternative answer for this case?

+5
source share
2 answers

How about using the new 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);
  }
}
+8
source

.
:

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

, , e.t.c. ( ). , ( JComponent):

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

, , , //. e.t.c.

, , isBorderOpaque() true, (, , ..), .

+10

All Articles