1 package charactermanaj.util;
3 import java.awt.Component;
4 import java.awt.Container;
5 import java.awt.Graphics;
6 import java.awt.image.BufferedImage;
7 import java.io.IOException;
9 import java.util.ArrayList;
10 import java.util.Collection;
12 import javax.imageio.ImageIO;
13 import javax.swing.AbstractButton;
14 import javax.swing.Icon;
15 import javax.swing.ImageIcon;
16 import javax.swing.JButton;
17 import javax.swing.JMenu;
20 public final class UIHelper extends ResourceLoader {
22 private static final UIHelper singleton = new UIHelper();
28 public static final UIHelper getInstance() {
33 * 指定したコンテナに含まれる指定したコンポーネント型のすべてのコンポーネントを返す.<br>
35 * @param <T> 対象のコンポーネントのクラス型
37 * @param container 対象のコンテナ
38 * @return コンポーネントのコレクション、もしくは空
40 @SuppressWarnings("unchecked")
41 public <T> Collection<T> getDescendantOfClass(Class<T> clz, Container container) {
42 if (container == null || clz == null) {
43 throw new IllegalArgumentException();
45 Collection<Component> components = new ArrayList<Component>();
46 getDescendantOfClass(clz, container, components);
47 return (Collection<T>) components;
50 private void getDescendantOfClass(Class<?> clz, Container container, Collection<Component> results) {
51 if (container == null) {
54 Component[] children = (container instanceof JMenu) ?
55 ((JMenu) container).getMenuComponents() : container.getComponents();
56 int mx = children.length;
57 for (int idx = 0; idx < mx; idx++) {
58 Component comp = children[idx];
59 if (clz.isInstance(comp)) {
61 } else if (comp instanceof Container) {
62 getDescendantOfClass(clz, (Container) comp, results);
68 * 2つのステートをもつアイコンを作成します.<br>
69 * このアイコンは、使用するコンポーネントがAbstractButton派生クラスであれば、isSelectedの結果が
70 * trueである場合は2番目のアイコンイメージを表示します.<br>
71 * isSelectedの結果がfalseであるか、もしくはAbstractButton派生クラスでなければ
72 * 最初のアイコンイメージを表示します.<br>
73 * @param iconName1 アイコン1
74 * @param iconName2 アイコン2
77 public Icon createTwoStateIcon(String iconName1, String iconName2) {
78 if (iconName1 == null || iconName2 == null || iconName1.length() == 0
79 || iconName2.length() == 0) {
80 throw new IllegalArgumentException();
82 final BufferedImage pinIcon1 = getImage(iconName1);
83 final BufferedImage pinIcon2 = getImage(iconName2);
85 Icon icon = new Icon() {
86 public void paintIcon(Component c, Graphics g, int x, int y) {
87 boolean selected = false;
88 if (c instanceof AbstractButton) {
89 AbstractButton btn = (AbstractButton) c;
90 selected = btn.isSelected();
92 BufferedImage iconImage;
98 int w = iconImage.getWidth();
99 int h = iconImage.getHeight();
100 g.drawImage(iconImage, x, y, w, h, 0, 0, w, h, null);
102 public int getIconHeight() {
103 return pinIcon1.getHeight();
105 public int getIconWidth() {
106 return pinIcon1.getWidth();
114 * アイコンボタン(非透過)を作成して返す.<br>
115 * リソースが取得できない場合は実行時例外が返される.<br>
116 * @param iconName 画像リソース名
119 public JButton createIconButton(String iconName) {
120 if (iconName == null || iconName.length() == 0) {
121 throw new IllegalArgumentException();
123 JButton btn = new JButton();
124 btn.setIcon(new ImageIcon(getImage(iconName)));
130 * 通常時の画像のみをもつ透過ボタンを作成して返す.<br>
131 * リソースが取得できない場合は実行時例外が返される.<br>
132 * @param normal 通常時の画像リソース
135 public JButton createTransparentButton(String normal) {
136 return createTransparentButton(normal, null);
140 * リソースから通常とホバー時の画像をもつ透過ボタンを作成して返す.<br>
141 * リソースが取得できない場合は実行時例外が返される.<br>
142 * @param normal 通常時の画像リソース
143 * @param rollover ホバー時の画像リソース
146 public JButton createTransparentButton(String normal, String rollover) {
147 if (normal == null || normal.length() == 0) {
148 throw new IllegalArgumentException();
150 ImageIcon normIcon = new ImageIcon(getImage(normal));
151 JButton btn = new JButton(normIcon);
153 if (rollover != null && rollover.length() != 0) {
154 ImageIcon rolloverIcon = new ImageIcon(getImage(rollover));
155 btn.setRolloverEnabled(true);
156 btn.setRolloverIcon(rolloverIcon);
157 btn.setPressedIcon(rolloverIcon);
160 btn.setOpaque(false);
161 btn.setBorderPainted(false);
162 btn.setContentAreaFilled(false);
169 * 画像が取得できない場合は実行時例外を返す.<br>
173 public BufferedImage getImage(String name) {
174 URL url = getResource(name);
176 throw new RuntimeException("resource not found. " + name);
179 return ImageIO.read(url);
181 } catch (IOException ex) {
182 throw new RuntimeException("image load error." + ex.getMessage(), ex);