Swing/TabbedPaneWithCheckBox のバックアップの現在との差分(No.1)
JTabbedPaneの余白にJComboBoxを配置
編集者:Terai Atsuhiro~
作成日:2006-04-03
更新日:2024-02-02 (金) 12:19:10
概要
JTabbedPane
の余白にJCheckBox
を配置して特定のタブの表示・非表示を切り替えます。
Screenshot
Advertisement
概要
JTabbedPaneの余白にJComboBoxを配置して特定のタブの開閉を行います。サンプルコード
#spanend
#spanadd
class TabbedPaneWithCompBorder implements Border, MouseListener, SwingConstants {
#spanend
private final JCheckBox checkBox;
private final JTabbedPane tab;
private final Container rubberStamp = new JPanel();
private final Rectangle rect = new Rectangle();
#spandel
#screenshot
#spanend
protected TabbedPaneWithCompBorder(JCheckBox checkBox, JTabbedPane tab) {
this.checkBox = checkBox;
this.tab = tab;
}
#spandel
**サンプルコード [#hd0302da]
#spanend
@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.getBoundsAt(tab.getTabCount() - 1);
int tabEnd = lastTab.x + lastTab.width;
if (xx < tabEnd) {
xx = tabEnd;
}
rect.setBounds(xx, -2, size.width, size.height);
SwingUtilities.paintComponent(g, checkBox, rubberStamp, rect);
}
-&jnlp;
-&jar;
-&zip;
@Override public Insets getBorderInsets(Component c) {
return new Insets(0, 0, 0, 0);
}
#spandel
**解説 [#md0e801a]
#spanend
@Override public boolean isBorderOpaque() {
return true;
}
private void dispatchEvent(MouseEvent e) {
if (!rect.contains(e.getX(), e.getY())) {
return;
}
checkBox.setBounds(rect);
checkBox.dispatchEvent(SwingUtilities.convertMouseEvent(tab, e, checkBox));
}
#spandel
//**参考リンク
#spanend
#spandel
**コメント [#n00381b0]
#spanend
@Override public void mouseClicked(MouseEvent e) {
dispatchEvent(e);
}
#spanadd
#spanend
@Override public void mouseEntered(MouseEvent e) {
dispatchEvent(e);
}
#spanadd
#spanend
@Override public void mouseExited(MouseEvent e) {
dispatchEvent(e);
}
#spanadd
#spanend
@Override public void mousePressed(MouseEvent e) {
dispatchEvent(e);
}
#spanadd
#spanend
@Override public void mouseReleased(MouseEvent e) {
dispatchEvent(e);
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
-
JTabbedPane
のBorder
にSwingUtilities.paintComponent(...)
メソッドを使ってJCheckBox
を描画 -
JCheckBox
がJTabbedPane
の子になってタブが増えないように、別途レンダリング用パネルを作成して中間コンテナに指定 -
JTabbedPane
で受け取ったマウスイベントをSwingUtilities.convertMouseEvent(...)
メソッドを利用し、チェックボックス用に座標などを変換してイベント転送 - タブとチェックボックスが重ならないようにフレームの最小サイズを設定
#spanend #spanadd frame.setMinimumSize(new Dimension(240, 80)); #spanend #spanadd
- -
- レイアウトマネージャーを利用して同様のことを行う方法もある
- Swing - Any layout suggestions for this?
- レイアウトマネージャーを自作するweebibさんの投稿 (reply 1)
-
OverlayLayout
を利用するcamickrさんの投稿 (reply 2)
- Swing - Any layout suggestions for this?