Swing/ButtonInTableHeader のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ButtonInTableHeader へ行く。
- 1 (2011-11-07 (月) 22:14:09)
- 2 (2012-12-15 (土) 04:36:51)
- 3 (2013-05-26 (日) 04:58:34)
- 4 (2013-08-17 (土) 15:43:15)
- 5 (2014-11-27 (木) 17:52:12)
- 6 (2015-02-26 (木) 13:58:46)
- 7 (2016-11-30 (水) 18:19:13)
- 8 (2017-11-22 (水) 15:31:15)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2019-07-05 (金) 14:31:17)
- 11 (2021-03-18 (木) 01:05:58)
TITLE:JTableHeaderにJButtonを追加する
Posted by aterai at 2011-11-07
JTableHeaderにJButtonを追加する
JTableHeaderにクリックするとポップアップメニューを表示するJButtonを追加します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
@Override public void mouseClicked(MouseEvent e) {
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);
Point pt = e.getPoint();
if(c.getComponentCount()>0 && r.contains(pt) && pop!=null) {
pop.show(header, r.x, r.height);
JButton b = (JButton)c.getComponent(0);
b.doClick();
e.consume();
}
}
@Override public void mouseExited(MouseEvent e) {
rolloverIndex = -1;
}
@Override public void mouseMoved(MouseEvent e) {
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に追加したマウスリスナーでクリックされた位置などを取得して表示するようになっています。