Java Swing Bordure Mate avec Dégradé Linéaire?


J'ai essayé l'exemple suivant pour l'application d'un dégradé linéaire: GradientPaintDemo2D.

Cela fonctionne bien, mais je voulais que la couleur du dégradé soit appliquée dans la bordure mate Java Swing. J'ai essayé ceci:

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

Mais c'est seulement pour appliquer un type de Color, pas GradientPaint.

Comme nous le savons tous, GradientPaint contient deux couleurs mélangées, comme indiqué dans l'exemple ci-dessus. Alors, quelle est la réponse alternative pour cette affaire?

Author: trashgod, 2012-04-09

2 answers

Comment sur l'utilisation des nouveaux MatteBorder(int, int, int, int, javax.swing.Icône)

//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
Author: aterai, 2012-04-09 08:42:28

Pour un tel cas spécifique, vous devrez créer votre propre bordure.
Voici un exemple avec la classe de bordure de gradient:

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

Bien sûr, vous pouvez spécifier n'importe quelle autre direction de dégradé, couleurs, etc. Vous pouvez également mettre leur initialisation dans le constructeur (si vous en avez besoin). Pour l'utiliser, il vous suffit de définir border (dans n'importe quel successeur de JComponent):

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

Fondamentalement, vous pouvez créer n'importe quelle bordure que vous aimez de cette façon avec n'importe quelle coloration / animation / formes e. t. c.

Et au fait - La méthode isBorderOpaque () devrait renvoyer true, si vous souhaitez créer une bordure semi-transparente (par exemple avec des couleurs semi-transparentes, en forme de coin arrondi et autres), sinon vous devrez faire face à des problèmes de repeindre les composants.

 10
Author: Mikle Garin, 2012-04-09 09:16:45