javax.swing.border パッケージには、あらかじめ便利なボーダーがいろいろと揃っています。 通常は、javax.swing.BorderFactoryを通じて各種ボーダーのインスタンスを取得して使いますが、それらSwing標準のボーダー、およびその組み合わせで間に合わない場合は、自作します。 今回は、ツールバーとメインパネルの間に引くボーダーを 実現する UnderlineBorder.java を作成しました。
2つのボタンの下に引かれている線がUnderlineBorderクラスで実現されています。 今回は、EtchedBorder に似せて線を描画しました。
パネルの下(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);
}
}
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);
}
}