1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Vector;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;
public class DrAndDrTest {
public DrAndDrTest() {
String[] dataRow ={"1234","1234","1234","1234","1234"};
String[] dataRow2 ={"4567","4567","4567","4567","4567"};
String[][] datas = new String[5][];
for(int i = 0 ; i< 5; i++) {
if( i%2 == 1 ) {
datas[i]=dataRow;
} else {
datas[i]=dataRow2;
}
}
MyTableModel m = new MyTableModel(datas,dataRow);
JTable t =new JTable(m);
t.setRowSelectionAllowed(true);
t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// On met en place le D&D sur la JTable
t.setDropMode(DropMode.INSERT_ROWS);
t.setDragEnabled(true);
t.setTransferHandler(new MyTransfertHandler());
t.setFillsViewportHeight(true);
JFrame f = new JFrame();
f.add(new JScrollPane(t));
f.setSize(400, 300);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
class MyTableModel extends DefaultTableModel {
public MyTableModel() {
super();
// TODO Auto-generated constructor stub
}
public MyTableModel(int rowCount, int columnCount) {
super(rowCount, columnCount);
// TODO Auto-generated constructor stub
}
public MyTableModel(Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
// TODO Auto-generated constructor stub
}
public MyTableModel(Object[][] data, Object[] columnNames) {
super(data, columnNames);
// TODO Auto-generated constructor stub
}
public MyTableModel(Vector columnNames, int rowCount) {
super(columnNames, rowCount);
// TODO Auto-generated constructor stub
}
public MyTableModel(Vector data, Vector columnNames) {
super(data, columnNames);
// TODO Auto-generated constructor stub
}
/** Méthode permettant de modifier l'emplacement d'une ligne dans une JTable (codée à la va vite en utilisant les interne de DefaultTableModel ce qui n'est pas forcément top top)
*
* @param rowIndexSrc La ligne d'origine de l'entrée à bouger
* @param rowIndexDst La ligne de destination de l'entrée à bouger
*/
public void moveRow(int rowIndexSrc, int rowIndexDst) {
Vector r =(Vector) dataVector.get(rowIndexSrc);
removeRow(rowIndexSrc);
dataVector.add(rowIndexDst, r);
fireTableRowsInserted(rowIndexDst, rowIndexDst);
}
}
/**Implémentation De transfertHandler correspondant à la JTable.
*
* @author
*
*/
class MyTransfertHandler extends TransferHandler {
@Override
public int getSourceActions(JComponent c) {
// TODO Auto-generated method stub
return TransferHandler.MOVE;
}
@Override
protected Transferable createTransferable(JComponent c) {
// on récupère la donnée qui nous intéresse (c'est a dire l'emplacement de la ligne que l'on veut bouger)
//Puis on l'enveloppe dans un Objet héritant de transferable. (une StringSelection en l'occurence)
JTable t = (JTable) c;
StringSelection s = new StringSelection(String.valueOf(t.getSelectedRow()));
return s;
}
public boolean canImport(TransferHandler.TransferSupport info) {
// pour ne gérer que le drop et pas le paste
if (!info.isDrop()) {
return false;
}
// On ne supporte que les chaines en entrée
if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
// On recherche l'emplacement du drop
JTable.DropLocation dl = (JTable.DropLocation)info.getDropLocation();
// On ne supporte que les emplacements de drop valides
return dl.getDropPoint() != null;
}
public boolean importData(TransferHandler.TransferSupport info) {
// dans le cas ou l'on ne pourrait supporter l'import
if (!canImport(info)) {
return false;
}
// On récupère l'emplacement du Drop
JTable.DropLocation dl = (JTable.DropLocation)info.getDropLocation();
// On récupère la ligne de destinatop du drop
int dstRow = dl.getRow();
// on récupère l'objet de transfert
Transferable trans = info.getTransferable();
// On récupère la donnée utile depuis l'objet de transfert (l'emplacement d'origine de la ligne à bouger)
int srcRow;
try {
srcRow = Integer.parseInt((String)trans.getTransferData(DataFlavor.stringFlavor));
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
// on effectue les modifications sur la JTable
JTable table = (JTable) info.getComponent();
MyTableModel m = (MyTableModel) table.getModel();
if (dstRow < 0) {
dstRow = 0;
}
if (dstRow > m.getRowCount()-1) {
dstRow = m.getRowCount()-1;
}
m.moveRow(srcRow, dstRow);
return true;
}
}
public static void main(String[] args) {
new DrAndDrTest();
}
} |
Partager