Swing/HoverCloseButton のバックアップ差分(No.5)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/HoverCloseButton へ行く。
- 1 (2008-01-21 (月) 15:27:41)
- 2 (2008-03-19 (水) 21:07:27)
- 3 (2014-10-02 (木) 03:46:09)
- 4 (2015-01-21 (水) 18:32:52)
- 5 (2016-04-27 (水) 17:46:19)
- 6 (2017-07-28 (金) 18:24:09)
- 7 (2018-07-31 (火) 13:58:59)
- 8 (2020-08-04 (火) 20:56:30)
- 9 (2021-12-23 (木) 17:18:41)
- 10 (2025-01-03 (金) 08:57:02)
- 11 (2025-01-03 (金) 09:01:23)
- 12 (2025-01-03 (金) 09:02:38)
- 13 (2025-01-03 (金) 09:03:21)
- 14 (2025-01-03 (金) 09:04:02)
- 15 (2025-06-19 (木) 12:41:37)
- 16 (2025-06-19 (木) 12:43:47)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- title: JTabbedPaneのCloseButtonをフォーカスがある場合だけ表示 tags: [JTabbedPane, JButton, Focus] author: aterai pubdate: 2008-01-21T15:27:41+09:00 description: JTabbedPaneのタブを閉じるボタンを、タブにフォーカスがある場合だけ表示します。 --- * 概要 [#s04e3478] `JTabbedPane`のタブを閉じるボタンを、タブにフォーカスがある場合だけ表示します。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTN-acwv2I/AAAAAAAAAbo/gFaIpQr1XGc/s800/HoverCloseButton.png) * サンプルコード [#h7af8be1] #code(link){{ public MyJTabbedPane() { super(); setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); addMouseMotionListener(new MouseMotionAdapter() { private int prev = -1; @Override public void mouseMoved(MouseEvent e) { JTabbedPane source = (JTabbedPane) e.getSource(); int focussed = source.indexAtLocation(e.getX(), e.getY()); if(focussed == prev) return; for(int i = 0; i < source.getTabCount(); i++) { TabPanel tab = (TabPanel) source.getTabComponentAt(i); tab.setButtonVisible(i == focussed); } prev = focussed; class HoverCloseButtonTabbedPane extends JTabbedPane { private transient MouseMotionListener hoverHandler; public HoverCloseButtonTabbedPane() { super(TOP, SCROLL_TAB_LAYOUT); } public HoverCloseButtonTabbedPane(int tabPlacement) { super(tabPlacement, SCROLL_TAB_LAYOUT); } @Override public void updateUI() { removeMouseMotionListener(hoverHandler); super.updateUI(); if (hoverHandler == null) { hoverHandler = new MouseMotionAdapter() { private int prev = -1; @Override public void mouseMoved(MouseEvent e) { JTabbedPane source = (JTabbedPane) e.getComponent(); int focussed = source.indexAtLocation(e.getX(), e.getY()); if (focussed == prev) { return; } for (int i = 0; i < source.getTabCount(); i++) { TabPanel tab = (TabPanel) source.getTabComponentAt(i); tab.setButtonVisible(i == focussed); } prev = focussed; } }; } }); addMouseMotionListener(hoverHandler); } @Override public void addTab(String title, final Component content) { super.addTab(title, content); setTabComponentAt(getTabCount() - 1, new TabPanel(this, title, content)); } } }} * 解説 [#bb2c52ca] 上記のサンプルでは、`JDK 6`で導入されたタブにコンポーネントを追加する機能を使って、タブ上にマウスカーソルがある場合だけ`JButton`を表示しています。 `JButton`が表示されても、そのタブ幅は常に一定で、内部のタブタイトルがクリップされるようになっています。 * 参考リンク [#c695580a] - [[JTabbedPaneにタブを閉じるボタンを追加>Swing/TabWithCloseButton]] - [[JTabbedPaneのタブ文字列をハイライト>Swing/TabTitleHighlight]] * コメント [#e680e90e] #comment - タブが選択されている場合にも`JButton`を表示していましたが、これを変更してタブ上にマウスカーソルがある場合だけ`JButton`を表示するようにしました。 -- &user(aterai); &new{2008-03-19 (水) 21:09:18}; #comment