Swing/NewTabButton のバックアップの現在との差分(No.5)
TITLE:JTabbedPane風のタブ配置をレイアウトマネージャーで変更
Posted by terai at 2009-06-08
JTabbedPane風のタブ配置をレイアウトマネージャーで変更
CardLayoutとJRadioBUttonで作成したJTabbedPane風コンポーネントのタブ配置を自作レイアウトマネージャーで変更します。-
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:
hreflang:
href: https://java-swing-tips.blogspot.com/2009/06/new-tab-button.html lang: en
概要
CardLayout
とJRadioButton
で作成したJTabbedPane
風コンポーネントのタブ配置を自作レイアウトマネージャーで変更します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spanadd
class TabLayout implements LayoutManager, Serializable {
#spanend
private static final long serialVersionUID = 1L;
private static final int TAB_WIDTH = 100;
@Override public void addLayoutComponent(String name, Component comp) {
/* not needed */
}
#spandel
**サンプルコード [#dbcd9376]
#spanend
#spandel
#code{{
#spanend
#spandel
class TabLayout implements LayoutManager, java.io.Serializable {
#spanend
public void addLayoutComponent(String name, Component comp) {}
public void removeLayoutComponent(Component comp) {}
public Dimension preferredLayoutSize(Container parent) {
@Override public void removeLayoutComponent(Component comp) {
/* not needed */
}
#spanadd
#spanend
@Override public Dimension preferredLayoutSize(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int last = parent.getComponentCount()-1;
int w = 0, h = 0;
if(last>=0) {
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);
}
}
public Dimension minimumLayoutSize(Container parent) {
@Override public Dimension minimumLayoutSize(Container parent) {
synchronized (parent.getTreeLock()) {
return new Dimension(100, 24);
}
}
public void layoutContainer(Container parent) {
@Override public void layoutContainer(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
int nrows = 1;
int ncols = ncomponents-1;
//boolean ltr = parent.getComponentOrientation().isLeftToRight();
#spandel
#spanend
if (ncomponents == 0) {
return;
}
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>100*(ncomponents-1))?100:width/ncols;
int gap = width - w*ncols;
// 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 a = (gap>0)?1:0;
gap--;
int cw = (i==ncols)?lastw:w+a;
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 += w + a;
x += cw;
}
}
}
public String toString() {
#spanadd
#spanend
@Override public String toString() {
return getClass().getName();
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、以下のようなレイアウトマネージャーを作成してJRadioButtonをタブ風に並べています。解説
上記のサンプルでは、以下のようなLayoutManager
を作成してJRadioButton
をJTabbedPane
風に並べています。
- 最後のタブ(タブ追加ボタン)は常に幅固定
- 最後のタブの高さがタブエリアの高さ
- タブエリアの幅に余裕がある場合は、各タブ幅は100pxで一定
- タブエリアの幅に余裕がない場合は、各タブ幅は均等
- 最後のタブ(タブ追加ボタン)の幅は常に固定
- 最後のタブの高さがタブエリアの高さ
- タブエリアの幅に余裕がある場合は各タブ幅は
100px
で一定 - タブエリアの幅に余裕がない場合は各タブ幅は均等
- タブを削除した場合先頭タブにフォーカスが移動する
- 左端に追加した
JButton
はタブエリアをラップするJPanel(BorderLayout)
のBorderLayout.WEST
で配置 - アイコンはランダム
- その他
- タブを削除した場合、先頭タブにフォーカスが移動するようになっています。
- 左のJButton(ダミー)は、タブエリアをラップするJPanel(BorderLayout)のBorderLayout.WESTに配置しています。
参考リンク
参考リンク
コメント
- タブの切り替えは、
mouseClicked
ではなく、mousePressed
した時に行うように変更。 -- aterai