Swing/TabbedPaneWithCheckBox のバックアップの現在との差分(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUQ8ALIWI/AAAAAAAAAlw/7jfCbNrxWK8/s800/TabbedPaneWithCheckBox.png --- * 概要 [#jf5f1d6a] `JTabbedPane`の余白に`JCheckBox`を配置して特定のタブの開閉を行います。 * 概要 [#summary] `JTabbedPane`の余白に`JCheckBox`を配置して特定のタブの表示・非表示を切り替えます。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUQ8ALIWI/AAAAAAAAAlw/7jfCbNrxWK8/s800/TabbedPaneWithCheckBox.png) * サンプルコード [#hd0302da] * サンプルコード [#sourcecode] #code(link){{ class TabbedPaneWithCompBorder implements Border, MouseListener, SwingConstants { private final JComponent dummy = new JPanel(); private final JCheckBox cbox; private final JCheckBox checkBox; 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()); } }); private final Container rubberStamp = new JPanel(); private final Rectangle rect = new Rectangle(); protected TabbedPaneWithCompBorder(JCheckBox checkBox, JTabbedPane tab) { this.checkBox = checkBox; this.tab = tab; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { Dimension size = cbox.getPreferredSize(); @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height) { Dimension size = checkBox.getPreferredSize(); int xx = tab.getSize().width - size.width; Rectangle lastTab = tab.getUI().getTabBounds(tab, tab.getTabCount()-1); Rectangle lastTab = tab.getBoundsAt(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); if (xx < tabEnd) { xx = tabEnd; } rect.setBounds(xx, -2, size.width, size.height); SwingUtilities.paintComponent(g, checkBox, rubberStamp, rect); } @Override public Insets getBorderInsets(Component c) { return new Insets(0,0,0,0); 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)); private void dispatchEvent(MouseEvent e) { if (!rect.contains(e.getX(), e.getY())) { return; } checkBox.setBounds(rect); checkBox.dispatchEvent(SwingUtilities.convertMouseEvent(tab, e, checkBox)); } @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); } } }} * 解説 [#md0e801a] `JTabbedPane`の`Border`に`SwingUtilities.paintComponent`メソッドを使って`JCheckBox`を描画しています。`JCheckBox`が`JTabbedPane`の子になってタブが増えないように、ダミーパネルを中間コンテナに指定しています。 @Override public void mouseClicked(MouseEvent e) { dispatchEvent(e); } `JTabbedPane`で受け取ったマウスイベントを、`SwingUtilities.convertMouseEvent`メソッドを利用し、チェックボックス用に座標などを変換して送り出しています。 @Override public void mouseEntered(MouseEvent e) { dispatchEvent(e); } ---- タブとチェックボックスが重ならないように、フレームの最小サイズを設定しています。 @Override public void mouseExited(MouseEvent e) { dispatchEvent(e); } @Override public void mousePressed(MouseEvent e) { dispatchEvent(e); } @Override public void mouseReleased(MouseEvent e) { dispatchEvent(e); } } }} * 解説 [#explanation] - `JTabbedPane`の`Border`に`SwingUtilities.paintComponent(...)`メソッドを使って`JCheckBox`を描画 - `JCheckBox`が`JTabbedPane`の子になってタブが増えないように、別途レンダリング用パネルを作成して中間コンテナに指定 - `JTabbedPane`で受け取ったマウスイベントを`SwingUtilities.convertMouseEvent(...)`メソッドを利用し、チェックボックス用に座標などを変換してイベント転送 - タブとチェックボックスが重ならないようにフレームの最小サイズを設定 #code{{ frame.setMinimumSize(new Dimension(240, 80)); }} ---- 他にも、レイアウトマネージャーを利用して同様のことを行う方法があります。 - レイアウトマネージャーを利用して同様のことを行う方法もある -- [https://community.oracle.com/thread/1389350 Swing - Any layout suggestions for this?] --- レイアウトマネージャーを自作するweebibさんの投稿 (reply 1) --- `OverlayLayout`を利用するcamickrさんの投稿 (reply 2) - [https://forums.oracle.com/thread/1389350 Swing - Any layout suggestions for this?] -- レイアウトマネージャーを自作するweebibさんの投稿 (reply 1) -- `OverlayLayout`を利用するcamickrさんの投稿 (reply 2) * 参考リンク [#ze3b3f0b] * 参考リンク [#reference] - [[JTabbedPaneの余白に文字列を表示>Swing/TabbedPaneWithText]] - [[JTabbedPaneの余白にJButtonを配置>Swing/TabbedPaneWithButton]] * コメント [#n00381b0] * コメント [#comment] #comment #comment