Swing/NewTabButton のバックアップの現在との差分(No.21)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/NewTabButton へ行く。
- 1 (2009-06-08 (月) 13:05:45)
- 2 (2009-06-22 (月) 12:23:33)
- 3 (2009-07-13 (月) 22:53:24)
- 4 (2009-07-15 (水) 20:57:00)
- 5 (2009-08-12 (水) 16:22:28)
- 6 (2011-12-05 (月) 14:27:30)
- 7 (2012-03-21 (水) 01:07:43)
- 8 (2012-03-21 (水) 18:46:30)
- 9 (2012-04-03 (火) 18:51:31)
- 10 (2013-01-09 (水) 20:50:24)
- 11 (2014-05-09 (金) 12:16:39)
- 12 (2014-09-14 (日) 17:19:22)
- 13 (2014-10-15 (水) 01:56:08)
- 14 (2014-11-30 (日) 00:47:00)
- 15 (2016-02-18 (木) 15:54:42)
- 16 (2017-07-07 (金) 16:54:58)
- 17 (2018-02-24 (土) 19:51:30)
- 18 (2018-07-10 (火) 13:59:54)
- 19 (2018-10-30 (火) 16:36:07)
- 20 (2020-10-30 (金) 02:02:08)
- 21 (2022-09-09 (金) 16:02:46)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: NewTabButton title: JTabbedPane風のタブ配置をレイアウトマネージャーで変更 tags: [CardLayout, LayoutManager, JRadioButton, JTabbedPane] author: aterai pubdate: 2009-06-08T13:05:45+09:00 description: CardLayoutとJRadioButtonで作成したJTabbedPane風コンポーネントのタブ配置を自作レイアウトマネージャーで変更します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTQUU8wtpI/AAAAAAAAAfY/BJyG5weJ1VA/s800/NewTabButton.png hreflang: href: https://java-swing-tips.blogspot.com/2009/06/new-tab-button.html lang: en --- * 概要 [#summary] `CardLayout`と`JRadioButton`で作成した`JTabbedPane`風コンポーネントのタブ配置を自作レイアウトマネージャーで変更します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTQUU8wtpI/AAAAAAAAAfY/BJyG5weJ1VA/s800/NewTabButton.png) * サンプルコード [#sourcecode] #code(link){{ class TabLayout implements LayoutManager, Serializable { private static final long serialVersionUID = 1L; private static final int TAB_WIDTH = 100; @Override public void addLayoutComponent(String name, Component comp) { /* not needed */ } @Override public void removeLayoutComponent(Component comp) { /* not needed */ } @Override public Dimension preferredLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int last = parent.getComponentCount() - 1; int w = 0; int h = 0; if (last >= 0) { Component comp = parent.getComponent(last); Dimension d = comp.getPreferredSize(); w = d.width; h = d.height; } return new Dimension(insets.left + insets.right + w, insets.top + insets.bottom + h); } } @Override public Dimension minimumLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { return new Dimension(100, 24); } } @Override public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { int ncomponents = parent.getComponentCount(); if (ncomponents == 0) { return; } // int nrows = 1; // boolean ltr = parent.getComponentOrientation().isLeftToRight(); Insets insets = parent.getInsets(); int ncols = ncomponents - 1; int lastw = parent.getComponent(ncomponents - 1).getPreferredSize().width; int width = parent.getWidth() - insets.left - insets.right - lastw; int h = parent.getHeight() - insets.top - insets.bottom; int w = width > TAB_WIDTH * ncols ? TAB_WIDTH : width / ncols; int gap = width - w * ncols; int x = insets.left; int y = insets.top; for (int i = 0; i < ncomponents; i++) { int cw = i == ncols ? lastw : w + (gap-- > 0 ? 1 : 0); parent.getComponent(i).setBounds(x, y, cw, h); x += cw; } } } @Override public String toString() { return getClass().getName(); } } }} * 解説 [#explanation] 上記のサンプルでは、以下のような`LayoutManager`を作成して`JRadioButton`を`JTabbedPane`風に並べています。 - 最後のタブ(タブ追加ボタン)の幅は常に固定 - 最後のタブの高さがタブエリアの高さ - タブエリアの幅に余裕がある場合は各タブ幅は`100px`で一定 - タブエリアの幅に余裕がない場合は各タブ幅は均等 - タブを削除した場合先頭タブにフォーカスが移動する - 左の`JButton`(ダミー)はタブエリアをラップする`JPanel(BorderLayout)`の`BorderLayout.WEST`に配置 - 左端に追加した`JButton`はタブエリアをラップする`JPanel(BorderLayout)`の`BorderLayout.WEST`で配置 - アイコンはランダム * 参考リンク [#reference] - [https://xp-style-icons.en.softonic.com/ XP Style Icons - Download] - [[CardLayoutを使ってJTabbedPane風のコンポーネントを作成>Swing/CardLayoutTabbedPane]] * コメント [#comment] #comment - タブの切り替えは、`mouseClicked`ではなく、`mousePressed`した時に行うように変更。 -- &user(aterai); &new{2012-03-21 (水) 18:46:30}; #comment