Swing/TabbedPaneWithCheckBox のバックアップ(No.13)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TabbedPaneWithCheckBox へ行く。
- 1 (2006-04-03 (月) 01:35:12)
- 2 (2006-11-17 (金) 11:13:29)
- 3 (2007-08-29 (水) 17:37:27)
- 4 (2008-06-16 (月) 22:32:38)
- 5 (2008-06-20 (金) 11:51:47)
- 6 (2011-05-12 (木) 23:42:43)
- 7 (2013-03-11 (月) 18:33:49)
- 8 (2013-04-06 (土) 20:04:48)
- 9 (2013-09-06 (金) 15:31:15)
- 10 (2014-11-25 (火) 03:03:31)
- 11 (2015-02-04 (水) 18:52:16)
- 12 (2015-03-19 (木) 16:26:09)
- 13 (2017-01-20 (金) 13:21:29)
- 14 (2017-12-16 (土) 20:28:34)
- 15 (2018-04-16 (月) 18:54:10)
- 16 (2020-04-09 (木) 14:40:48)
- 17 (2021-10-13 (水) 02:46:43)
- 18 (2023-11-15 (水) 09:34:41)
- 19 (2024-02-02 (金) 12:18:09)
- category: swing folder: TabbedPaneWithCheckBox title: JTabbedPaneの余白にJCheckBoxを配置 tags: [JTabbedPane, JCheckBox, Border] author: aterai pubdate: 2006-04-03T01:35:12+09:00 description: JTabbedPaneの余白にJCheckBoxを配置して特定のタブの開閉を行います。 image:
概要
JTabbedPane
の余白にJCheckBox
を配置して特定のタブの開閉を行います。
Screenshot
Advertisement
サンプルコード
class TabbedPaneWithCompBorder implements Border, MouseListener, SwingConstants {
private final JComponent dummy = new JPanel();
private final JCheckBox cbox;
private final JTabbedPane tab;
private Rectangle rect;
public TabbedPaneWithCompBorder(JCheckBox cbox, JTabbedPane tab) {
this.cbox = cbox;
this.tab = tab;
tab.addMouseListener(this);
cbox.setFocusPainted(false);
cbox.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent me) {
JCheckBox cb = (JCheckBox) me.getSource();
cb.setSelected(!cb.isSelected());
}
});
}
@Override public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
Dimension size = cbox.getPreferredSize();
int xx = tab.getSize().width - size.width;
Rectangle lastTab = tab.getUI().getTabBounds(tab, tab.getTabCount() - 1);
int tabEnd = lastTab.x + lastTab.width;
if (xx < tabEnd) {
xx = tabEnd;
}
rect = new Rectangle(xx, -2, size.width, size.height);
SwingUtilities.paintComponent(g, cbox, dummy, rect);
}
@Override public Insets getBorderInsets(Component c) {
return new Insets(0, 0, 0, 0);
}
@Override public boolean isBorderOpaque() {
return true;
}
private void dispatchEvent(MouseEvent me) {
if (rect == null || !rect.contains(me.getX(), me.getY())) {
return;
}
cbox.setBounds(rect);
cbox.dispatchEvent(SwingUtilities.convertMouseEvent(tab, me, cbox));
}
@Override public void mouseClicked(MouseEvent me) { dispatchEvent(me); }
@Override public void mouseEntered(MouseEvent me) { dispatchEvent(me); }
@Override public void mouseExited(MouseEvent me) { dispatchEvent(me); }
@Override public void mousePressed(MouseEvent me) { dispatchEvent(me); }
@Override public void mouseReleased(MouseEvent me) { dispatchEvent(me); }
}
View in GitHub: Java, Kotlin解説
JTabbedPane
のBorder
にSwingUtilities.paintComponent
メソッドを使ってJCheckBox
を描画しています。JCheckBox
がJTabbedPane
の子になってタブが増えないように、ダミーパネルを中間コンテナに指定しています。
JTabbedPane
で受け取ったマウスイベントを、SwingUtilities.convertMouseEvent
メソッドを利用し、チェックボックス用に座標などを変換して送り出しています。
タブとチェックボックスが重ならないように、フレームの最小サイズを設定しています。
frame.setMinimumSize(new Dimension(240, 80));
他にも、レイアウトマネージャーを利用して同様のことを行う方法があります。
- Swing - Any layout suggestions for this?
- レイアウトマネージャーを自作するweebibさんの投稿 (reply 1)
OverlayLayout
を利用するcamickrさんの投稿 (reply 2)