TITLE:JTableHeaderにJPopupMenuを追加してソート

Posted by aterai at 2009-12-07

JTableHeaderにJPopupMenuを追加してソート

JTableHeaderにJPopupMenuを追加してソートします。

  • &jnlp;
  • &jar;
  • &zip;
RowSorterPopupMenu.png

サンプルコード

private class TablePopupMenu extends JPopupMenu {
  private final List<SortAction> actions = Arrays.asList(
    new SortAction(SortOrder.ASCENDING),
    new SortAction(SortOrder.DESCENDING));
    //new SortAction(SortOrder.UNSORTED));
  public TablePopupMenu() {
    super();
    for(Action a:actions) add(a);
  }
  @Override
  public void show(Component c, int x, int y) {
    JTableHeader h = (JTableHeader)c;
    int i = h.columnAtPoint(new Point(x, y));
    i = h.getTable().convertColumnIndexToModel(i);
    for(SortAction a:actions) a.setIndex(i);
    super.show(c, x, y);
  }
}
private class SortAction extends AbstractAction{
  private final SortOrder dir;
  public SortAction(SortOrder dir) {
    super(dir.toString());
    this.dir = dir;
  }
  private int index = -1;
  public void setIndex(int index) {
    this.index = index;
  }
  @Override public void actionPerformed(ActionEvent e) {
    table.getRowSorter().setSortKeys(Arrays.asList(
      new RowSorter.SortKey(index, dir)));
  }
}

解説

上記のサンプルでは、マウスカーソルの下にあるJTabelHeaderカラムをクリック(WindowsLnF:右クリック)することで、JPopupMenuを表示してソートすることができます。

  • 左クリックではソートしない

ソートしたあとで、JTableHeaderのフォーカスペイントをクリアするために以下のようなPopupMenuListenerを追加しています。

JPopupMenu pop = new TablePopupMenu();
final JTableHeader header = table.getTableHeader();
header.setComponentPopupMenu(pop);
pop.addPopupMenuListener(new PopupMenuListener() {
  public void popupMenuCanceled(PopupMenuEvent e) {}
  public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    //System.out.println("popupMenuWillBecomeInvisible");
    header.setDraggedColumn(null);
    //header.setResizingColumn(null);
    //header.setDraggedDistance(0);
    header.repaint();
  }
  public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
});

コメント