Swing/TabComponentsOfDifferentSizes の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/TabComponentsOfDifferentSizes へ行く。
- Swing/TabComponentsOfDifferentSizes の差分を削除
--- category: swing folder: TabComponentsOfDifferentSizes title: JTabbedPaneのタブコンポーネントが異なるサイズで表示可能になるようJSplitPaneに配置する tags: [JTabbedPane, JSplitPane] author: aterai pubdate: 2021-10-18T00:06:05+09:00 description: JTabbedPaneをJSplitPaneに配置し、各タブコンポーネントごとに異なるサイズで表示可能になるようDividerの位置などを調整します。 image: https://drive.google.com/uc?id=1PhwFToigKUQ-AKOEaVaCNp-j7b_75HAe hreflang: href: https://java-swing-tips.blogspot.com/2021/10/add-jtabbedpane-tab-component-to.html lang: en --- * 概要 [#summary] `JTabbedPane`を`JSplitPane`に配置し、各タブコンポーネントごとに異なるサイズで表示可能になるよう`Divider`の位置などを調整します。 #download(https://drive.google.com/uc?id=1PhwFToigKUQ-AKOEaVaCNp-j7b_75HAe) * サンプルコード [#sourcecode] #code(link){{ public void tabComponentResized(ComponentEvent e, JTabbedPane tabs) { Component c = e.getComponent(); if (c.equals(tabs.getSelectedComponent())) { Dimension d = c.getPreferredSize(); if (isTopBottomTabPlacement(tabs.getTabPlacement())) { d.height = splitPane.getDividerLocation() - tabAreaSize.height; } else { d.width = splitPane.getDividerLocation() - tabAreaSize.width; } c.setPreferredSize(d); } } public void updateDividerLocation(JTabbedPane tabs) { Component c = tabs.getSelectedComponent(); if (isTopBottomTabPlacement(tabs.getTabPlacement())) { splitPane.setDividerLocation(c.getPreferredSize().height + tabAreaSize.height); } else { splitPane.setDividerLocation(c.getPreferredSize().width + tabAreaSize.width); } } }} * 解説 [#explanation] - `JTabbedPane` -- デフォルトの`JTabbedPane`に配置されるタブコンポーネントはすべて同じサイズになる -- `JTabbedPane`の最小サイズをタブエリアのサイズに変更して`JSplitPane`でタブエリアが非表示にならないよう設定 -- `JTabbedPane`に`ChangeListener`を追加し、タブの選択状態が変化したらタブコンポーネントの推奨サイズとタブエリアのサイズの合計まで`Divider`の位置を移動 -- `JTabbedPane`に`MouseListener`を追加し、選択状態のタブがクリックされたら(タブの切り替えが発生しないクリック)タブコンポーネントの折り畳みとデフォルトサイズへの展開をトグル実行 - タブコンポーネント -- 各タブコンポーネント(このサンプルでは`JLabel`)に`ComponentListener`を追加し、`JTabbedPane`で選択されているタブコンポーネントが`Divider`の移動などでリサイズされたら`Divider`の位置とタブエリアのサイズからタブコンポーネントの推奨サイズを変更 - `JSplitPane` -- 左コンポーネントに`JTabbedPane`、右コンポーネントに適当なコンポーネント(このサンプルでは`JTree`)を配置 -- タブコンポーネントに`JSplitPane`を使用する方法もあるが、これをデフォルトの`JSplitPane`と組み合わせるのは複雑になりそう -- タブコンポーネントに`JSplitPane`を使用する方法もあるが、これをデフォルトの`JSplitPane`と組み合わせるのは複雑になりそう? * 参考リンク [#reference] - [[JTabbedPaneで選択されているタブの幅のみ拡張する>Swing/ExpandActiveTabWidth]] - [[JTabbedPaneのタブタイトル文字列を回転して縦組表示する>Swing/RotatedVerticalTextTabs]] * コメント [#comment] #comment #comment