All Downloads are FREE. Search and download functionalities are using the official Maven repository.

freeseawind.lf.border.LuckShapeBorder Maven / Gradle / Ivy

The newest version!
package freeseawind.lf.border;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.geom.RectangularShape;

import javax.swing.border.AbstractBorder;

/**
 * Support focus change borders. Adds focus listener to change the border color.
 *
 * @author freeseawind@github
 * @version 1.0
 *
 */
public abstract class LuckShapeBorder extends AbstractBorder
{
    private static final long serialVersionUID = -6529775355312979219L;
    private Insets insets;
    private Color normalColor;
    private Color focusColor;
    private Color outShadowColor;
    private Color innerShadowColor;

    public LuckShapeBorder(Insets i)
    {
        this.insets = i;
        this.normalColor = new Color(190, 190, 190);
        this.focusColor = new Color(3, 158, 211);
        this.outShadowColor = new Color(179, 218, 231);
        this.innerShadowColor = new Color(221, 242, 249);
    }

    public void paintBorder(Component c,
                            Graphics g,
                            int x,
                            int y,
                            int width,
                            int height)
    {
        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        RectangularShape shape = getBorderShape(c);

        if(shape != null)
        {
            shape.setFrame(x, y, width - 1, height - 1);

            if(!isFocusGained(c))
            {
                // 非焦点状态下
                g2d.setColor(normalColor);

                g2d.draw(shape);
            }
            else
            {
                // 获取焦点状态下
                g2d.setColor(outShadowColor);

                g2d.draw(shape);

                g2d.setColor(innerShadowColor);

                g2d.drawRect(x + 2, y + 2, width - 5, height - 5);

                g2d.setColor(focusColor);

                shape.setFrame(x + 1, y + 1, width - 3, height - 3);

                g2d.draw(shape);
            }
        }

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    }

    public Insets getBorderInsets(Component c)
    {
        return insets;
    }

    public Insets getBorderInsets(Component c, Insets insets)
    {
        return this.insets;
    }

    public boolean isFocusGained(Component c)
    {
        LuckBorderField field = getBorderField(c);

        return isFoucusGaind(field);
    }

    public RectangularShape getBorderShape(Component c)
    {
        LuckBorderField field = getBorderField(c);

        return getBorderShape(field, c);
    }

    /**
     * get border field.
     *
     * @param c 
     * @return border field.
     */
    public abstract LuckBorderField getBorderField(Component c);

    /**
     * get border shape.
     * 
     * @param field
     * @param c
     * @return
     */
    private RectangularShape getBorderShape(LuckBorderField field, Component c)
    {
        if(field != null)
        {
            return field.getBorderShape();
        }

        return c.getBounds();
    }

    /**
     * component isFoucusGaind.
     * 
     * @param field
     * @return
     */
    private boolean isFoucusGaind(LuckBorderField field)
    {
        if(field != null)
        {
            return field.isFocusGaind();
        }

        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy