TITLE:JTableの行を移動
#navi(../)
*JTableの行を移動 [#u1a0d5a8]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-02-23~
更新日:&lastmod;

#contents

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

#screenshot

**サンプルコード [#yc463e85]
#code{{
 class DownAction extends AbstractAction{
   public DownAction(String str) {
     super(str);
   }
   public void actionPerformed(ActionEvent evt) {
     downActionPerformed(evt);
   }
 }
 private void downActionPerformed(ActionEvent e) {
   System.out.println("-------- 下へ --------");
   int[] pos = jtable.getSelectedRows();
   if(pos==null || pos.length<=0) return;
   DefaultTableModel mdl = (DefaultTableModel) jtable.getModel();
   if((e.getModifiers() & ActionEvent.SHIFT_MASK)!=0) {
     mdl.moveRow(pos[0], pos[pos.length-1], mdl.getRowCount()-pos.length);
     jtable.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);
     jtable.setRowSelectionInterval(pos[0]+1, pos[pos.length-1]+1);
   }
   scrollSelectedRow();
 }
 
 public void showRowPop(MouseEvent e) {
   int row     = jtable.rowAtPoint(e.getPoint());
   int count   = jtable.getSelectedRowCount();
   int[] ilist = jtable.getSelectedRows();
   boolean flg = true;
   for(int i=0;i<ilist.length;i++) {
     if(ilist[i]==row) {
       flg = false;
       break;
     }
   }
   if(row>0 && flg) jtable.setRowSelectionInterval(row, row);
   JPopupMenu pop = new JPopupMenu();
   Action act = new TestCreateAction("追加", null);
   act.setEnabled(count>1?false:true);
   pop.add(act);
   pop.addSeparator();
   act = new DeleteAction("削除", null);
   act.setEnabled(row<0?false:true);
   pop.add(act);
   pop.addSeparator();
   act = new UpAction("上へ");
   act.setEnabled(count>0?true:false);
   pop.add(act);
   act = new DownAction("下へ");
   act.setEnabled(count>0?true:false);
   pop.add(act);
   pop.show((JComponent)e.getSource(), e.getX(), e.getY());
 }
}}
-&jnlp;
-&jar;
-&zip;

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

//**参考リンク
**コメント [#b4d206da]
#comment