Swing/MoveRow のバックアップの現在との差分(No.3)
JTableの行を移動
編集者:Terai Atsuhiro~
作成日:2004-02-23
更新日:2021-08-12 (木) 14:12:29
概要
ツールバーや、ポップアップメニューを使って、JTable
の行を上下に移動します。
概要
ツールバーや、ポップアップメニューを使って、JTableの行を上下に移動します。Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
class DownAction extends AbstractAction {
#spanend
public DownAction(String str) {
super(str);
}
#spandel
**サンプルコード [#yc463e85]
#spanend
class DownAction extends AbstractAction{
public DownAction(String str) {
super(str);
}
public void actionPerformed(ActionEvent evt) {
downActionPerformed(evt);
}
}
private void downActionPerformed(ActionEvent e) {
Logger.global.info("-------- 下へ --------");
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());
}
@Override public void actionPerformed(ActionEvent e) {
downActionPerformed(e);
}
#spanadd
}
#spanend
#spanadd
private void downActionPerformed(ActionEvent e) {
#spanend
System.out.println("-------- 下へ --------");
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
int[] pos = table.getSelectedRows();
if (pos.length == 0) {
return;
}
RowDataModel model = (RowDataModel) table.getModel();
boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
if (isShiftDown) { // Jump to the end
model.moveRow(pos[0], pos[pos.length - 1], model.getRowCount() - pos.length);
table.setRowSelectionInterval(model.getRowCount() - pos.length, model.getRowCount() - 1);
} else {
if (pos[pos.length - 1] == model.getRowCount() - 1) {
return;
}
model.moveRow(pos[0], pos[pos.length - 1], pos[0] + 1);
table.setRowSelectionInterval(pos[0] + 1, pos[pos.length - 1] + 1);
}
Rectangle r = table.getCellRect(model.getRowCount() - 1, 0, true);
table.scrollRectToVisible(r);
#spanadd
}
#spanend
-[[サンプルを起動>http://terai.xrea.jp/swing/moverow/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/moverow/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/moverow/src.zip]]
#spandel
**解説 [#q2ca8783]
#spanend
#spandel
上記のサンプルでは、DefaultTableModel#moveRowメソッドを使用して、選択した行を上下に動かしています。シフトキーを押しながら、ツールバーの移動ボタンを押すとそれぞれ、先頭、末尾に移動します。
#spanend
#spanadd
public void showRowPop(MouseEvent e) {
#spanend
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());
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlinコメント
解説
上記のサンプルでは、DefaultTableModel#moveRow(...)
メソッドを使用して選択した行を上下に動かしています。Shiftキーを押しながらツールバーの移動ボタンを押すとそれぞれ、先頭、末尾に移動します。