• title: JTableの行を移動 tags: [JTable, JPopupMenu, JToolBar] author: aterai pubdate: 2004-02-23 description: ツールバーや、ポップアップメニューを使って、JTableの行を上下に移動します。

概要

ツールバーや、ポップアップメニューを使って、JTableの行を上下に移動します。

サンプルコード

class DownAction extends AbstractAction{
  public DownAction(String str) {
    super(str);
  }
  @Override public void actionPerformed(ActionEvent e) {
    downActionPerformed(e);
  }
}
private void downActionPerformed(ActionEvent e) {
  System.out.println("-------- 下へ --------");
  int[] pos = table.getSelectedRows();
  if (pos == null || pos.length <= 0) return;
  DefaultTableModel mdl = (DefaultTableModel) table.getModel();
  if ((e.getModifiers() & InputEvent.SHIFT_DOWN_MASK) != 0) {
    mdl.moveRow(pos[0], pos[pos.length - 1], mdl.getRowCount() - pos.length);
    table.setRowSelectionInterval(mdl.getRowCount() - pos.length,
      mdl.getRowCount() - 1);
  } else {
    if (pos[pos.length - 1] == mdl.getRowCount() - 1) return;
    mdl.moveRow(pos[0], pos[pos.length - 1], pos[0] + 1);
    table.setRowSelectionInterval(pos[0] + 1, pos[pos.length - 1] + 1);
  }
  scrollSelectedRow();
}

public void showRowPop(MouseEvent e) {
  int row     = table.rowAtPoint(e.getPoint());
  int count   = table.getSelectedRowCount();
  int[] ilist = table.getSelectedRows();
  boolean flg = true;
  for (int i = 0; i < ilist.length; i++) {
    if (ilist[i] == row) {
      flg = false;
      break;
    }
  }
  if (row > 0 && flg) table.setRowSelectionInterval(row, row);
  JPopupMenu pop = new JPopupMenu();
  Action act = new TestCreateAction("追加", null);
  act.setEnabled(count == 1);
  pop.add(act);
  pop.addSeparator();
  act = new DeleteAction("削除", null);
  act.setEnabled(row >= 0);
  pop.add(act);
  pop.addSeparator();
  act = new UpAction("上へ");
  act.setEnabled(count > 0);
  pop.add(act);
  act = new DownAction("下へ");
  act.setEnabled(count > 0);
  pop.add(act);
  pop.show(e.getComponent(), e.getX(), e.getY());
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、DefaultTableModel#moveRowメソッドを使用して、選択した行を上下に動かしています。Shiftキーを押しながら、ツールバーの移動ボタンを押すとそれぞれ、先頭、末尾に移動します。

コメント