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