SwingUtils.java
package myproject.java.utils;
import java.awt.Component;
import java.awt.Container;
/**
* SwingのComponentに対するユーティリティ機能を提供します。
* <p>
* この実装は、性能について考慮されていないため実際に適用する場合は適宜ソースコードの
* 改変を検討してください。
*
* Copyright ycookjp
* https://github.com/ycookjp/
*/
public class SwingUtils {
/**
* 外部空のインスタンスかを抑止するためのコンストラクタ。
*/
private SwingUtils() { }
/**
* {@link Component}の名前を指定して、{@link Container}に保持されている{@link Component}を
* 取得します。引数で指定された{@link Container}が保持する{@link Component}から指定された
* 名前のものが見つからなかった場合は、再帰的に{@link Component}を検索します。
* <dl>
* <dt>JFrameからComponentを取得する例</dt>
* <dd>
* JFrameの中に保持されている{@link Component}を取得する場合は、{@link Container}に
* JFrameのcontentPainを指定して、{@link Component}を取得します。
* <table border="1"><caption>コードの例</caption><tr><td><pre>
* JFrame frame = new JFrame();
* ...
* Component component = SwingUtils.getComponentByName(frame.getComponentPane(), "MyComponentName");
* ...
* </pre></td></tr></table>
* </dd>
* </dl>
* @param container 取得対象の{@link Component}を保持している{@link Container}
* @param name 検索対象の{@link Container}の名前
* @return 取得した{@link Container}のインスタンスを返します。
* 引数container、またはnameにnullが指定された場合はnullを返します。
* 指定された名前の{@link Container}が見つからなかった場合はnullを返します。
*/
public static Component getComponentByName(Container container, String name) {
Component result = null;
if (container == null || name == null) {
return null;
}
Component[] components = container.getComponents();
for (Component component : components) {
String componentName = component.getName();
if (name.equals(componentName)) {
// 指定された名前のComponentが見つかったらそのコンポーネントを返す。
result = component;
break;
}
}
if (result == null) {
// Container直下のComponentから見つからなかった場合は、再帰的にComponentを取得する
for (Component component : components) {
if (component instanceof Container) {
Container childContainer = (Container) component;
Component child = getComponentByName(childContainer, name);
if (child != null && name.equals(child.getName())) {
result = child;
break;
}
}
}
}
return result;
}
}