Home About
Java

Java Swing によるカスタムボーダー ( custom border ) の作成

javax.swing.border パッケージには、あらかじめ便利なボーダーがいろいろと揃っています。 通常は、javax.swing.BorderFactoryを通じて各種ボーダーのインスタンスを取得して使いますが、それらSwing標準のボーダー、およびその組み合わせで間に合わない場合は、自作します。 今回は、ツールバーとメインパネルの間に引くボーダーを 実現する UnderlineBorder.java を作成しました。

underlineborder

2つのボタンの下に引かれている線がUnderlineBorderクラスで実現されています。 今回は、EtchedBorder に似せて線を描画しました。

UnderlineBorder.java

パネルの下(bottom)部分だけボーダーを引く 自作のボーダークラスです。

javax.swing.border.Borderインタフェースを実装し、 あとは、paintBorderメソッド内で、ボーダーの描画を行います。

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.border.Border;


public class UnderlineBorder implements Border {
    private Insets insets = new Insets(0,0,10,0);
    public Insets getBorderInsets(Component arg0) {
        return insets;
    }
    public boolean isBorderOpaque() {
        return true;
    }

    public void paintBorder(Component c, Graphics g,int x, int y, int width, int height){
        Insets insets=getBorderInsets(c);

        Color keepC = g.getColor();
        int x1=x;
        int y1=y+height-insets.bottom/2;

        int x2=x+width;
        int y2=y1;

        g.setColor(Color.LIGHT_GRAY);
        g.drawLine(x1,y1,x2,y2);

        int x1=x;
        int y1=y+height-(insets.bottom/2)+1;

        int x2=x+width;
        int y2=y1;

        g.setColor(Color.WHITE);
        g.drawLine(x1,y1,x2,y2);

        g.setColor(keepC);
    }
}

TestPanel.java

UnderlineBorderを試すためのテストクラス。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestPanel extends JPanel {
    public TestPanel() {
        super();
        
        setLayout(new BorderLayout());
        
        JPanel toolBar=new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));
        toolBar.setBorder(new UnderlineBorder());
            
        JButton button1=new JButton("button1");
        JButton button2=new JButton("button2");
            
        toolBar.add(button1);
        toolBar.add(button2);
        
        add(toolBar,BorderLayout.NORTH);
    }
    
    public Insets getInsets() {
        return new Insets(10,10,10,10);
    }
    
    public static void main(String[] args){
        JFrame f=new JFrame();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setSize(400,300);
        f.getContentPane().add(new TestPanel());
        f.setVisible(true);
    }
}