• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableHeaderにJButtonを追加する
#navi(../)
RIGHT:Posted by [[aterai]] at 2011-11-07
RIGHT:Posted by &author(aterai); at 2011-11-07
*JTableHeaderにJButtonを追加する [#m34a7190]
JTableHeaderにクリックするとポップアップメニューを表示するJButtonを追加します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh3.googleusercontent.com/-ccZ08VSXYwE/Trd27UaeD2I/AAAAAAAABEk/1NAYoZ1NGV0/s800/ButtonInTableHeader.png)

**サンプルコード [#g556fd49]
#code{{
#code(link){{
@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);
  //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) {
    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;
}
}}

**解説 [#m5fb923c]
上記のサンプルでは、JTableHeaderの各カラムにマウスカーソルがある場合、HeaderRenderer#getTableCellRendererComponent(...)内で、右端にJButtonを追加しています。ボタンがクリックされたときに表示するJPopupMenuは、JTableHeaderに追加したマウスリスナーでクリックされた位置などを取得して表示するようになっています。

//**参考リンク
**コメント [#p1ee78e8]
- Nimbus LnF で、JPopupMenuが表示されないのを修正。 -- [[aterai]] &new{2011-11-07 (月) 22:15:02};

#comment