第16夜 カスタムボーダを簡単にセットする

また久々にこのタグつかうわぁ。

今回はカスタムボーダの簡単な使い方。

まず、カスタムボーダとしてHogeBorderがあったとする。
http://shin.cside.com/diary/2010/0530-01.png


こいつをプロジェクトのツリーからファイルをドラッグしてコントロールに貼り付ける。
http://shin.cside.com/diary/2010/0530-02.png


貼り付けた直後。
http://shin.cside.com/diary/2010/0530-03.png


プレビュー表示。ちゃんとテキストフィールドになっているのがわかると思う。
http://shin.cside.com/diary/2010/0530-04.png

ちなみにボーダクラスのソースはこんな感じ。JTextFieldとJPanelだけ対応。opaqueプロパティには対応していないが、簡単なのでその場合自分で考えて見ましょう。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.border.AbstractBorder;

public class HogeBorder extends AbstractBorder{

    Insets insets = new Insets(16, 8, 8, 6);

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

    public Insets getInsets() {
        return insets;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {

        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

        Graphics top = g2.create(x, y, width, insets.top);
        top.setColor(c.getParent().getBackground());
        top.fillRect(0, 0, width, insets.top);
        top.setColor(c.getBackground());
        top.fillRoundRect(0, insets.top-insets.bottom, width, insets.top*2-1, 16, 16);
        top.dispose();
        
        Graphics bottom = g2.create(x, y+height-insets.bottom, width, insets.bottom);
        bottom.setColor(c.getParent().getBackground());
        bottom.fillRect(0, 0, width, insets.top);
        bottom.setColor(c.getBackground());
        bottom.fillRoundRect(0, -insets.bottom, width-1, insets.bottom*2-1, 16, 16);
        bottom.dispose();

        
        //枠線を描画
        g2.setColor(Color.RED);
        g2.setStroke(new BasicStroke(1.0f));
        g2.drawRoundRect(x, y+insets.bottom, width-1, height-insets.bottom-1, 16, 16);

        //文字を表示
        g2.setColor(Color.BLACK);
        g2.setFont(new Font(Font.MONOSPACED , Font.BOLD , 14));
        g2.drawString("HOGE", x+insets.left, y+12);
    }

}