4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.editor;
10 import java.awt.BorderLayout;
11 import java.awt.Color;
12 import java.awt.Component;
13 import java.awt.Graphics;
14 import java.awt.Graphics2D;
15 import java.awt.Insets;
16 import java.awt.LayoutManager;
17 import java.awt.RenderingHints;
18 import javax.swing.JComponent;
19 import javax.swing.border.Border;
24 public class BalloonBorder implements Border{
26 private static final int RADIUS = 5;
32 public BalloonBorder(){
39 * 隙間が透明なフキダシ装飾を任意のコンポーネントに施す。
40 * @param inner 装飾対象のコンポーネント
41 * @return 装飾されたコンポーネント
43 public static JComponent decorateTransparentBorder(JComponent inner){
44 JComponent result = new TransparentContainer(inner);
46 Border border = new BalloonBorder();
47 result.setBorder(border);
54 * @param comp {@inheritDoc}
55 * @return {@inheritDoc}
58 public Insets getBorderInsets(Component comp){
59 Insets insets = new Insets(RADIUS, RADIUS, RADIUS, RADIUS);
65 * 必ずfalseを返す(このBorderは透明)。
66 * @return {@inheritDoc}
69 public boolean isBorderOpaque(){
75 * @param comp {@inheritDoc}
76 * @param g {@inheritDoc}
77 * @param x {@inheritDoc}
78 * @param y {@inheritDoc}
79 * @param width {@inheritDoc}
80 * @param height {@inheritDoc}
83 public void paintBorder(Component comp,
86 int width, int height ){
87 final int diameter = RADIUS * 2;
88 final int innerWidth = width - diameter;
89 final int innerHeight = height - diameter;
91 Graphics2D g2d = (Graphics2D) g;
93 Color bgColor = comp.getBackground();
94 g2d.setColor(bgColor);
96 Object antiAliaseHint =
97 g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
98 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
99 RenderingHints.VALUE_ANTIALIAS_ON );
101 g2d.fillRect(x + RADIUS, y,
103 g2d.fillRect(x, y + RADIUS,
104 RADIUS, innerHeight);
105 g2d.fillRect(x + RADIUS + innerWidth, y + RADIUS,
106 RADIUS, innerHeight);
107 g2d.fillRect(x + RADIUS, y + RADIUS + innerHeight,
110 int right = 90; // 90 degree right angle
112 g2d.fillArc(x + innerWidth, y,
113 diameter, diameter, right * 0, right);
115 diameter, diameter, right * 1, right);
116 g2d.fillArc(x, y + innerHeight,
117 diameter, diameter, right * 2, right);
118 g2d.fillArc(x + innerWidth, y + innerHeight,
119 diameter, diameter, right * 3, right);
121 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, antiAliaseHint);
128 * 1つの子を持ち、背景色操作を委譲する。
129 * つまりこのコンテナにBorderを設定すると子の背景色が反映される。
131 @SuppressWarnings("serial")
132 private static class TransparentContainer extends JComponent{
134 private final JComponent inner;
138 * @param inner 内部コンポーネント
140 public TransparentContainer(JComponent inner){
147 LayoutManager layout = new BorderLayout();
149 add(this.inner, BorderLayout.CENTER);
157 * @return {@inheritDoc}
160 public Color getBackground(){
161 Color bg = this.inner.getBackground();
167 * 背景色指定をフックし、子の背景色を指定する。
168 * @param bg {@inheritDoc}
171 public void setBackground(Color bg){
172 this.inner.setBackground(bg);