TITLE:CardLayoutを使ってJTabbedPane風のコンポーネントを作成

Posted by at 2008-10-27

CardLayoutを使ってJTabbedPane風のコンポーネントを作成

`CardLayoutJRadioButtonJTabelHeaderを組み合わせてJTabbedPane`風のコンポーネントを作成します。

  • &jnlp;
  • &jar;
  • &zip;
CardLayoutTabbedPane.png

サンプルコード

class CardLayoutTabbedPane extends JPanel {
  protected final CardLayout cardLayout = new CardLayout();
  protected final JPanel tabPanel = new JPanel(new GridLayout(1, 0, 0, 0));
  protected final JPanel wrapPanel = new JPanel(new BorderLayout(0, 0));
  protected final JPanel contentsPanel = new JPanel(cardLayout);
  protected final ButtonGroup bg = new ButtonGroup();
  public CardLayoutTabbedPane() {
    super(new BorderLayout());
    int left  = 1;
    int right = 3;
    tabPanel.setBorder(BorderFactory.createEmptyBorder(1,left,0,right));
    contentsPanel.setBorder(BorderFactory.createEmptyBorder(4,left,2,right));
    wrapPanel.add(tabPanel);
    wrapPanel.add(new JLabel("test:"), BorderLayout.WEST);
    add(wrapPanel, BorderLayout.NORTH);
    add(contentsPanel);
  }
  public void addTab(final String title, final Component comp) {
    JRadioButton b = new TabButton(new AbstractAction(title) {
      public void actionPerformed(ActionEvent e) {
        cardLayout.show(contentsPanel, title);
      }
    });
    tabPanel.add(b);
    bg.add(b);
    b.setSelected(true);
    contentsPanel.add(comp, title);
    cardLayout.show(contentsPanel, title);
  }
}
View in GitHub: Java, Kotlin

解説

`CardLayoutJTabbedPane`風のコンポーネントを作成すると、タブエリアのレイアウトをネストしてコンポーネントの追加したり、レイアウトマネージャーを変更することで、タブの配置を変更することが簡単になります。

  • `CardLayout+JRadioButton`
    • 上記のサンプルでは、`JRadioButtonGridLayout`で、均等なサイズになるように並べています。
    • `UI`を変更して、チェックは非表示にしています。
    • マウスでタブを押した時ではなく、放した時に切り替わります(`Opera`風)
  • `CardLayout+JTableHeader`
    • 空の`JTableを作成してJTableHeader`を取り出して利用しています。
    • `JTableHeader`のドラッグ&ドロップによる入れ替えや、ヘッダ(タブ)幅のリサイズが利用できます。

参考リンク

コメント

  • `CloseButton`(ダミー)を追加。 -- aterai