Swing/ButtonInTableHeader のバックアップの現在との差分(No.1)
TITLE:JTableHeaderにJButtonを追加する
Posted by aterai at 2011-11-07
JTableHeaderにJButtonを追加する
JTableHeaderにクリックするとポップアップメニューを表示するJButtonを追加します。-
category: swing
folder: ButtonInTableHeader
title: JTableHeaderにJButtonを追加する
tags: [JTable, JTableHeader, JButton, JPopupMenu, MouseListener]
author: aterai
pubdate: 2011-11-07T22:14:09+09:00
description: JTableHeaderにクリックするとポップアップメニューを表示するJButtonを追加します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2011/12/dropdown-menu-button-in-jtableheader.html lang: en
概要
JTableHeader
にクリックするとポップアップメニューを表示するJButton
を追加します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
@Override public void mouseClicked(MouseEvent e) {
JTableHeader header = (JTableHeader)e.getSource();
JTableHeader header = (JTableHeader) e.getSource();
JTable table = header.getTable();
TableColumnModel columnModel = table.getColumnModel();
int vci = columnModel.getColumnIndexAtX(e.getX());
int mci = table.convertColumnIndexToModel(vci);
TableColumn column = table.getColumnModel().getColumn(mci);
int w = column.getWidth();
//int h = header.getHeight();
Rectangle r = header.getHeaderRect(vci);
Container c = (Container)getTableCellRendererComponent(table, "", true, true, -1, vci);
Insets i = c.getInsets();
r.translate(w-i.right, 0);
r.setSize(10, r.height);
Container c = (Container) getTableCellRendererComponent(table, "", true, true, -1, vci);
// if (!isNimbus) {
// Insets i = c.getInsets();
// r.translate(r.width - i.right, 0);
// } else {
r.translate(r.width - BUTTON_WIDTH, 0);
r.setSize(BUTTON_WIDTH, r.height);
Point pt = e.getPoint();
if(c.getComponentCount()>0 && r.contains(pt) && pop!=null) {
if (c.getComponentCount() > 0 && r.contains(pt) && pop != null) {
pop.show(header, r.x, r.height);
JButton b = (JButton)c.getComponent(0);
JButton b = (JButton) c.getComponent(0);
b.doClick();
e.consume();
}
}
#spanadd
#spanend
@Override public void mouseExited(MouseEvent e) {
rolloverIndex = -1;
}
#spanadd
#spanend
@Override public void mouseMoved(MouseEvent e) {
JTableHeader header = (JTableHeader)e.getSource();
JTableHeader header = (JTableHeader) e.getSource();
JTable table = header.getTable();
TableColumnModel columnModel = table.getColumnModel();
int vci = columnModel.getColumnIndexAtX(e.getX());
int mci = table.convertColumnIndexToModel(vci);
rolloverIndex = mci;
}
解説
上記のサンプルでは、JTableHeaderの各カラムにマウスカーソルがある場合、HeaderRenderer#getTableCellRendererComponent(...)内で、右端にJButtonを追加しています。ボタンがクリックされたときに表示するJPopupMenuは、JTableHeaderに追加したマウスリスナーでクリックされた位置などを取得して表示するようになっています。解説
-
JTableHeader
の各カラムにマウスカーソルがある場合、HeaderRenderer#getTableCellRendererComponent(...)
内で右端にJButton
を追加表示- この
JButton
がクリックされるとJPopupMenu
を開く -
JPopupMenu
の表示位置はJTableHeader
に追加したMouseListener
で取得して設定
- この