Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swing Custom Border

Is there any way to achieve custom javax.swing.border.Border as shown in image?

corner border around Swing component or widget

like image 298
user225928 Avatar asked Jul 24 '13 12:07

user225928


People also ask

How do you add a border to a Swing?

To put a border around a JComponent , you use its setBorder method. You can use the BorderFactory class to create most of the borders that Swing provides. If you need a reference to a border — say, because you want to use it in multiple components — you can save it in a variable of type Border .

What is a JScrollPane?

A JScrollPane manages a viewport, optional vertical and horizontal scroll bars, and optional row and column heading viewports. You can find task-oriented documentation of JScrollPane in How to Use Scroll Panes, a section in The Java Tutorial.


2 Answers

You simply need to extend AbstractBorder and override its paintBorder() method, here is one related example :

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.awt.geom.Line2D.Double;
import javax.swing.*;
import javax.swing.border.AbstractBorder;

public class CustomMarginBorder
{
    private JPanel contentPane;
    private CustomBorder customBorder;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Custom Arrow Border Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        customBorder = new CustomBorder(Color.BLUE, 15);
        contentPane = new JPanel();     
        contentPane.setBorder(customBorder);    

        frame.setContentPane(contentPane);
        frame.setSize(300, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new CustomMarginBorder().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class CustomBorder extends AbstractBorder
{
    private Color borderColour;
    private int gap;

    public CustomBorder(Color colour, int g)
    {
        borderColour = colour;
        gap = g;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y
                                                   , int width
                                                   , int height)
    {
        super.paintBorder(c, g, x, y, width, height);
        Graphics2D g2d = null;
        if (g instanceof Graphics2D)
        {
            g2d = (Graphics2D) g;
            g2d.setColor(borderColour);
            //Left Border
            g2d.draw(new Line2D.Double((double)x + 10, (double)y + 10
                                , (double)x + 10, (double)y + 20));
            g2d.draw(new Line2D.Double( (double)x + 10, (double)y + 10
                                , (double)x + 20, (double)y + 10));
            // Right Border
            g2d.draw(new Line2D.Double( (double)width - 10, (double)y + 10
                                , (double)width - 10, (double)y + 20));
            g2d.draw(new Line2D.Double( (double)width - 10, (double)y + 10
                                , (double)width - 20, (double)y + 10));
            // Lower Left Border
            g2d.draw(new Line2D.Double( (double)x + 10, (double)height - 10
                                , (double)x + 20, (double)height - 10));
            g2d.draw(new Line2D.Double( (double)x + 10, (double)height - 10
                                , (double)x + 10, (double)height - 20));
            // Lower Right Border
            g2d.draw(new Line2D.Double( (double)width - 10, (double)height - 10
                                , (double)width - 20, (double)height - 10));
            g2d.draw(new Line2D.Double( (double)width - 10, (double)height - 10
                                , (double)width - 10, (double)height - 20));
        }
    }

    @Override
    public Insets getBorderInsets(Component c)
    {
        return (getBorderInsets(c, new Insets(gap, gap, gap, gap)));
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets)
    {
        insets.left = insets.top = insets.right = insets.bottom = gap;
        return insets;
    }

    @Override
    public boolean isBorderOpaque()
    {
        return true;
    }
}

For Thick line Border use this :

class CustomBorder extends AbstractBorder
{
    private Color borderColour;
    private int gap;
    private double rectWidth;
    private double rectHeight;

    public CustomBorder(Color colour, int g, double w, double h)
    {
        borderColour = colour;
        gap = g;
        rectWidth = w;
        rectHeight = h;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y
                                                   , int width
                                                   , int height)
    {
        super.paintBorder(c, g, x, y, width, height);
        Graphics2D g2d = null;
        if (g instanceof Graphics2D)
        {
            g2d = (Graphics2D) g;
            g2d.setColor(borderColour);
            //Left Border
            g2d.fill(new Rectangle2D.Double(
                                  (double)x + gap
                                , (double)y + gap
                                , rectWidth, rectHeight));
            g2d.fill(new Rectangle2D.Double(
                                  (double)x + gap
                                , (double)y + gap + rectHeight
                                , rectHeight, rectWidth));
            // Right Border
            g2d.fill(new Rectangle2D.Double(
                                  (double)width - gap - rectWidth
                                , (double)y + gap
                                , rectWidth, rectHeight));
            g2d.fill(new Rectangle2D.Double(
                                  (double)width - gap - rectHeight
                                , (double)y + gap + rectHeight
                                , rectHeight, rectWidth));
            // Lower Left Border
            g2d.fill(new Rectangle2D.Double(
                                  (double)x + gap
                                , (double)height - gap - rectWidth
                                , rectHeight, rectWidth));
            g2d.fill(new Rectangle2D.Double(
                                  (double)x + gap
                                , (double)height - gap
                                , rectWidth, rectHeight));
            // Lower Right Border
            g2d.fill(new Rectangle2D.Double(
                                  (double)width - gap - rectHeight
                                , (double)height - gap - rectWidth
                                , rectHeight, rectWidth));
            g2d.fill(new Rectangle2D.Double(
                                  (double)width - gap - rectWidth
                                , (double)height - gap
                                , rectWidth, rectHeight));
        }
    }

    @Override
    public Insets getBorderInsets(Component c)
    {
        return (getBorderInsets(c, new Insets(gap, gap, gap, gap)));
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets)
    {
        insets.left = insets.top = insets.right = insets.bottom = gap;
        return insets;
    }

    @Override
    public boolean isBorderOpaque()
    {
        return true;
    }
}

OUTPUT :

Border with thin and thick line

THINBORDERTHICKBORDER

For

like image 64
nIcE cOw Avatar answered Oct 11 '22 17:10

nIcE cOw


Yes. See this answer for an example.

like image 32
Andrew Thompson Avatar answered Oct 11 '22 15:10

Andrew Thompson