• category: swing folder: CardLayoutTabbedPane title: CardLayoutを使ってJTabbedPane風のコンポーネントを作成 tags: [CardLayout, GridLayout, LayoutManager, JRadioButton, JTableHeader, JTabbedPane, DragAndDrop] author: aterai pubdate: 2008-10-27T13:54:48+09:00 description: CardLayoutとJRadioButtonやJTableHeaderを組み合わせてJTabbedPane風のコンポーネントを作成します。 image: https://lh3.googleusercontent.com/-i_zX5mZNCL0/VZBOp7c2kwI/AAAAAAAAN74/yEHMZL9l8xs/s800/CardLayoutTabbedPane.png hreflang:
       href: http://java-swing-tips.blogspot.com/2008/11/create-jtabbedpane-like-component-using.html
       lang: en

概要

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

サンプルコード

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) {
      @Override 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

解説

このサンプルでは、CardLayoutJRadioButtonを使用してJTabbedPane風のコンポーネントを作成しています。CardLayoutでパネルを切り替えるためのタブにはUIを変更してチェックアイコンを非表示にしたJRadioButtonを使用し、これらのタブを配置するタブエリア(JPanel)のレイアウトマネージャーにGridLayoutを適用して、すべてのタブサイズが均等になるように設定しています。


CardLayout+JTableHeaderを使用したサンプルは、JTableHeaderで作成したタブエリアでCardLayoutのコンテナを切り替えるに移動しました。

参考リンク

コメント