Swing/GetComponentsRecursively の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/GetComponentsRecursively へ行く。
- Swing/GetComponentsRecursively の差分を削除
--- category: swing folder: GetComponentsRecursively title: Containerの子Componentを再帰的にすべて取得する tags: [Container, Component, JFileChooser, JTable] author: aterai pubdate: 2017-02-06T14:11:50+09:00 description: Containerの子Componentを再帰的にすべて取得するメソッドを作成し、JFileChooserに配置されたJTableを取得します。 image: https://drive.google.com/uc?id=1NedWhPhVuMDTwrHRaFdW-YXZjdH-019yuw --- * 概要 [#summary] `Container`の子`Component`を再帰的にすべて取得するメソッドを作成し、`JFileChooser`に配置された`JTable`を取得します。 #download(https://drive.google.com/uc?id=1NedWhPhVuMDTwrHRaFdW-YXZjdH-019yuw) * サンプルコード [#sourcecode] #code(link){{ public static Stream<Component> descendants(Container parent) { return Stream.of(parent.getComponents()) .filter(Container.class::isInstance) .map(Container.class::cast) .flatMap(c -> Stream.concat(Stream.of(c), descendants(c))); } // ... descendants(fileChooser) .filter(JTable.class::isInstance) .map(JTable.class::cast) .findFirst() .ifPresent(t -> t.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN)); }} * 解説 [#explanation] 上記のサンプルでは、`JFileChooser`の詳細表示で使用されている`JTable`を取得し、その自動サイズ変更モードを変更しています。 - `Stream#flatMap(...)`を使用してすべての子コンポーネントを検索しそのストリームを取得する -- 上記の関数で`JFileChooser`のすべての子コンポーネントのストリームを取得し、さらに`JFileChooser`の詳細表示に使用されている`JTable`を絞り込む -- 詳細表示用`JTable`を発見したらその自動サイズ変更モードを`JTable#setAutoResizeMode(...)`で変更 -- `JPopupMenu`が`JComponent#setComponentPopupMenu(...)`で設定されていてもその子`Component`は取得しない --- [[JFileChooserでの隠しファイルの非表示設定を変更する>Swing/FileHidingEnabled]] - `JPopupMenu`が`JComponent#setComponentPopupMenu(...)`で設定されていてもその子`Component`は取得しない -- [[JFileChooserでの隠しファイルの非表示設定を変更する>Swing/FileHidingEnabled]] - `Stream#reduce(...)`を使用して検索対象のルートコンテナを含めてコンポーネントのストリームを取得する別方法: - `Stream#reduce(...)`を使用して検索対象のルートコンテナを含めたすべてのコンポーネントを検索しそのストリームを取得する別方法: #code{{ public static Stream<Component> descendantOrSelf(Container parent) { return Stream.of(parent.getComponents()) .filter(Container.class::isInstance) .map(c -> descendantOrSelf((Container) c)) .reduce(Stream.of(parent), Stream::concat); } }} - `Stream`は使用せずに再帰で検索する別方法: #code{{ public static boolean searchAndResizeMode(Container parent) { for (Component c: parent.getComponents()) { if (c instanceof JTable) { ((JTable) c).setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); return true; } else if (c instanceof Container && searchAndResizeMode((Container) c)) { return true; } } return false; } }} * 参考リンク [#reference] - [[JFileChooserのデフォルトをDetails Viewに設定>Swing/DetailsViewFileChooser]] - [[JFileChooserでの隠しファイルの非表示設定を変更する>Swing/FileHidingEnabled]] - [http://www.java2s.com/Code/Java/Swing-JFC/GetAllComponentsinacontainer.htm Get All Components in a container : Container « Swing JFC « Java] * コメント [#comment] #comment #comment