Swing/CardLayoutTabbedPane のバックアップの現在との差分(No.4)
TITLE:CardLayoutを使ってJTabbedPane風のコンポーネントを作成
Posted by terai at 2008-10-27
CardLayoutを使ってJTabbedPane風のコンポーネントを作成
CardLayoutとJRadioButtonやJTabelHeaderを組み合わせてJTabbedPane風のコンポーネントを作成します。-
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:
hreflang:
href: https://java-swing-tips.blogspot.com/2008/11/create-jtabbedpane-like-component-using.html lang: en
概要
CardLayout
とJRadioButton
やJTableHeader
を組み合わせてJTabbedPane
風のコンポーネントを作成します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
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));
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) {
#spanadd
#spanend
public void addTab(String title, Component comp) {
JRadioButton b = new TabButton(new AbstractAction(title) {
public void actionPerformed(ActionEvent e) {
@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);
}
}
解説
CardLayoutでJTabbedPane風のコンポーネントを作成すると、タブエリアのレイアウトをネストしてコンポーネントの追加したり、レイアウトマネージャーを変更することで、タブの配置を変更することが簡単になります。解説
-
CardLayout
とJRadioButton
を使用してJTabbedPane
風のコンポーネントを作成-
CardLayout
でパネルを切り替えるためのタブとしてUI
を変更してチェックアイコンを非表示にしたJRadioButton
を使用 - これらのタブを配置するタブエリア(
JPanel
)のレイアウトマネージャーにGridLayout
を適用して、すべてのタブサイズが均等になるように設定 -
CardLayout
+JTableHeader
を使用したサンプルはJTableHeaderで作成したタブエリアでCardLayoutのコンテナを切り替えるに移動
-
- CardLayout+JRadioButton
- 上記のサンプルでは、JRadioButtonをGridLayoutで、均等なサイズになるように並べています。
- UIを変更して、チェックは非表示にしています。
- マウスでタブを押した時ではなく、放した時に切り替わります(Opera風)。
参考リンク
- JTabbedPaneのタブをドラッグ&ドロップ
- TabbedPane風のタブ配置をレイアウトマネージャーで変更
- JTableHeaderで作成したタブエリアでCardLayoutのコンテナを切り替える
- CardLayout+JTableHeader
- 空のJTableを作成してJTableHeaderを取り出して利用しています。
- JTableHeaderのドラッグ&ドロップによる入れ替えや、ヘッダ(タブ)幅のリサイズが利用できます。
コメント
- タブに
CloseButton
を追加。 -- aterai
参考リンク
コメント
- CloseButton(ダミー)を追加。 -- terai