Pessoal,
Eu tenho um JTable e pretendo adicionar dois botões "Up" e "Down" para permitir ao usuário fazer re-positionamento de itens na table.
JTable tblDetalhe = new JTable();
AbstractTableModel atm = (AbstractTableModel) this.tblDetalhe.getModel();
Li no aqui no fórum que o jtable trabalha com manipulação dos objetos via model, e a manipulação dos objetos ocorre toda por ele.
Ao trangos e barrancos, montei um lego com exemplos que fui encontrando pelo google a fora.
Imagine que a jtable está populada, e que mágicamente o evento do botão chamou meu método abaixo 
public void actionPerformed(ActionEvent e) {
//aqui cato o item selecionado. pelo menos no bug está apontando para a posição correspondente :-)
int moveMe = tblDetalhe.getSelectedRows()[0];
//ai tenho dois métodos marotos para fazer o up ou o down de acordo com o botão pressionado.
if (e.getSource().equals(this.btnUpItem)) {
//UP ARROW BUTTON
if (moveMe != 0) {
//not already at top
swap(moveMe, moveMe-1);
tblDetalhe.setSelectionMode(moveMe-1);
//tblDetalhe.ensureIndexIsVisible(moveMe-1);
}
}
if (e.getSource().equals(this.btnDownItem)) {
//DOWN ARROW BUTTON
if (moveMe != tblDetalhe.getModel().getRowCount()-1) {
//not already at bottom
swap(moveMe, moveMe+1);
tblDetalhe.setSelectionMode(moveMe+1);
//list.ensureIndexIsVisible(moveMe+1);
}
}
}
o pulo do gato é o método swap - que deve fazer o troca-a-troca dos itens:
private void swap(int a, int b) {
TableModel model = tblDetalhe.getModel();
Object aObject = null;
Object bObject = null;
int aLin = -1, aCol = -1;
int bLin = -1, bCol = -1;
for (int lin = 0 ; lin < model.getRowCount(); lin++) {
for(int col = 0 ; col < model.getColumnCount(); col++) {
System.out.println("item["+model.getValueAt(lin, col)+"]");
if (lin == a) {
//System.out.println("elemento a["+model.getValueAt(lin, col)+"]");
aObject = tblDetalhe.getValueAt(lin, col);
aLin = lin;
aCol = col;
}
if (lin == b) {
//System.out.println("elemento b["+model.getValueAt(lin, col)+"]");
bObject = tblDetalhe.getValueAt(lin, col);
bLin = lin;
bCol = col;
}
}//end for col
}//end for lin
//a intenção neste trecho é realizar a troca dos valores.
if (aObject != null && bObject!=null) {
model.setValueAt(aObject, bLin, bCol);
model.setValueAt(bObject, aLin, aCol);
}
}
