4 * Copyright(c) 2008 olyutorskii
\r
5 * $Id: BalloonBorder.java 953 2009-12-06 16:42:14Z 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
29 * 隙間が透明なフキダシ装飾を任意のコンポーネントに施す。
\r
30 * @param inner 装飾対象のコンポーネント
\r
31 * @return 装飾されたコンポーネント
\r
33 public static JComponent decorateTransparentBorder(JComponent inner){
\r
34 JComponent result = new TransparentContainer(inner);
\r
36 Border border = new BalloonBorder();
\r
37 result.setBorder(border);
\r
45 public BalloonBorder(){
\r
52 * @param comp {@inheritDoc}
\r
53 * @return {@inheritDoc}
\r
55 public Insets getBorderInsets(Component comp){
\r
56 Insets insets = new Insets(RADIUS, RADIUS, RADIUS, RADIUS);
\r
62 * 必ずfalseを返す(このBorderは透明)。
\r
63 * @return {@inheritDoc}
\r
65 public boolean isBorderOpaque(){
\r
71 * @param comp {@inheritDoc}
\r
72 * @param g {@inheritDoc}
\r
73 * @param x {@inheritDoc}
\r
74 * @param y {@inheritDoc}
\r
75 * @param width {@inheritDoc}
\r
76 * @param height {@inheritDoc}
\r
78 public void paintBorder(Component comp,
\r
81 int width, int height ){
\r
82 final int diameter = RADIUS * 2;
\r
83 final int innerWidth = width - diameter;
\r
84 final int innerHeight = height - diameter;
\r
86 Graphics2D g2d = (Graphics2D) g;
\r
88 Color bgColor = comp.getBackground();
\r
89 g2d.setColor(bgColor);
\r
91 Object antiAliaseHint =
\r
92 g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
\r
93 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
\r
94 RenderingHints.VALUE_ANTIALIAS_ON );
\r
96 g2d.fillRect(x + RADIUS, y,
\r
97 innerWidth, RADIUS);
\r
98 g2d.fillRect(x, y + RADIUS,
\r
99 RADIUS, innerHeight);
\r
100 g2d.fillRect(x + RADIUS + innerWidth, y + RADIUS,
\r
101 RADIUS, innerHeight);
\r
102 g2d.fillRect(x + RADIUS, y + RADIUS + innerHeight,
\r
103 innerWidth, RADIUS);
\r
105 int right = 90; // 90 degree right angle
\r
107 g2d.fillArc(x + innerWidth, y,
\r
108 diameter, diameter, right * 0, right);
\r
110 diameter, diameter, right * 1, right);
\r
111 g2d.fillArc(x, y + innerHeight,
\r
112 diameter, diameter, right * 2, right);
\r
113 g2d.fillArc(x + innerWidth, y + innerHeight,
\r
114 diameter, diameter, right * 3, right);
\r
116 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, antiAliaseHint);
\r
123 * 1つの子を持ち、背景色操作を委譲する。
\r
124 * つまりこのコンテナにBorderを設定すると子の背景色が反映される。
\r
126 @SuppressWarnings("serial")
\r
127 private static class TransparentContainer extends JComponent{
\r
129 private final JComponent inner;
\r
133 * @param inner 内部コンポーネント
\r
135 public TransparentContainer(JComponent inner){
\r
138 this.inner = inner;
\r
142 LayoutManager layout = new BorderLayout();
\r
144 add(this.inner, BorderLayout.CENTER);
\r
152 * @return {@inheritDoc}
\r
155 public Color getBackground(){
\r
156 Color bg = this.inner.getBackground();
\r
162 * 背景色指定をフックし、子の背景色を指定する。
\r
163 * @param bg {@inheritDoc}
\r
166 public void setBackground(Color bg){
\r
167 this.inner.setBackground(bg);
\r