package de.hauke.schwimmbad.application.playground;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DragSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Vector;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.RowSorter;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class Testing13 extends JFrame {
private RightTableTransferHandler rightTableHandler = new RightTableTransferHandler();
private LeftTableTransferHandler leftTableHandler = new LeftTableTransferHandler();
private final DataFlavor rightTableFlavor = new ActivationDataFlavor(String.class, DataFlavor.javaJVMLocalObjectMimeType, "MeinFlavor1");
private final DataFlavor leftTableFlavor = new ActivationDataFlavor(Object.class, DataFlavor.javaJVMLocalObjectMimeType, "MeinFlavor2");
private JTable leftTable;
private JTable rightTable;
private JLabel informationLabel;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new Testing13();
}
});
}
public Testing13() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("Test");
setSize(800, 800);
setLocationRelativeTo(null);
setLayout(null);
// Tabellen erzeugen
createTableLeft();
createTableRight();
// Das Label erzeugen mit dem man Items aus der rechten Tabelle entfernen kann
JLabel destination = new JLabel();
destination.setBackground(Color.RED);
destination.setOpaque(true);
destination.setBounds(600, 550, 100, 100);
destination.setTransferHandler(new TrashcanTransferHandler());
add(destination);
// Informationslabel anlegen
informationLabel = new JLabel("Nichts gedropped");
informationLabel.setBounds(400, 710, 200, 30);
add(informationLabel);
setVisible(true);
}
/**
* Die linke Tabelle aus der die Items raus kopiert werden koennen
*/
private void createTableLeft() {
String[] columns = { "Spalte 1", "Spalte 2", "Spalte 3" };
Object[][] rows = new Object[60][3];
for (int i = 0; i < 60; i++) {
Object[] row = new Object[3];
row[0] = "Spalte 1 - Zeile " + i;
row[1] = "Spalte 2 - Zeile " + i;
row[2] = "Spalte 3 - Zeile " + i;
rows[i] = row;
}
TableModel model = new DefaultTableModel(rows, columns);
leftTable = new JTable(model);
leftTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
leftTable.setTransferHandler(leftTableHandler);
leftTable.setDragEnabled(true);
// table.setTransferHandler(rightTableHandler);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
leftTable.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(leftTable);
pane.setBounds(10, 10, 350, 700);
add(pane);
}
/**
* Die rechte "Ziel" Tabelle in die die Items rein gedroppt werden koennen
*/
private void createTableRight() {
String[] columns = { "Spalte 1" , "Spalte 2" , "Spalte 3" };
Object[][] rows = new Object[2][3];
for(int i = 0 ; i < 2 ; i++) {
Object[] row = new Object[3];
row[0] ="Dummy Daten - Spalte 1 - Zeile " + i;
row[1] ="Dummy Daten - Spalte 2 - Zeile " + i;
row[2] ="Dummy Daten - Spalte 3 - Zeile " + i;
rows[i] = row;
}
TableModel model = new DefaultTableModel(rows, columns);
rightTable = new JTable(model);
rightTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
rightTable.setDropMode(DropMode.INSERT_ROWS);
rightTable.setDragEnabled(true);
rightTable.setTransferHandler(rightTableHandler);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
rightTable.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(rightTable);
pane.setBounds(400, 10, 350, 200);
add(pane);
}
/**
* Dieser Handler ist fuer das Label zustaendig. Hier duerfen nur
* Events aus der rechten Tabelle auflaufen
*
* @author Gulich
*
*/
class TrashcanTransferHandler extends TransferHandler {
@Override
public boolean canImport(TransferSupport arg0) {
// Pruefen was in dem String steht der uebertragen wird. Wenn dieser mit "REMOVEROW" anfaengt, darf
// hier etwas drauf gedroppt werden
try {
if(((String) arg0.getTransferable().getTransferData(rightTableFlavor)).startsWith("REMOVEROW")) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public boolean importData(TransferSupport arg0) {
try {
String message = (String) arg0.getTransferable().getTransferData(rightTableFlavor);
// Den Wert hinter dem : ist die Zeilennummer die entfernt werden soll
Integer row = Integer.valueOf(message.split(":")[1]);
informationLabel.setText("Entferne aus der rechten Tabelle Zeile : " + row);
DefaultTableModel model = (DefaultTableModel) rightTable.getModel();
model.removeRow(row);
model.fireTableDataChanged();
rightTable.setCursor(Cursor.getDefaultCursor());
leftTable.setCursor(Cursor.getDefaultCursor());
setCursor(Cursor.getDefaultCursor());
} catch (Exception e) {
e.printStackTrace();
}
return super.importData(arg0);
}
}
/**
* Der Transferhandler der die Zeilen aus der rechten Tabelle auf das Label
* dropped
*
*
*/
class RightTableTransferHandler extends TransferHandler{
@Override
protected Transferable createTransferable(JComponent c) {
// Die Zeile aus der rechten Tabelle auslesen
JTable table = (JTable) c;
Integer removeRow = table.getSelectedRow();
// Die Daten die uebertragen werden bestehen aus einem Qualifier "REMOVEROW", einem Trennzeichen ":"
// und der Zeilennummer der rechten Tabelle
return new DataHandler("REMOVEROW:"+removeRow, rightTableFlavor.getMimeType());
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
private int addIndex = -1;
private int addCount = 0;
private JComponent source = null;
@Override
public boolean canImport(TransferSupport info) {
JTable t = (JTable)info.getComponent();
boolean b = info.isDrop()&&info.isDataFlavorSupported(leftTableFlavor);
t.setCursor(b?DragSource.DefaultMoveDrop:DragSource.DefaultMoveNoDrop);
System.out.println(b);
return b;
}
@Override
public boolean importData(TransferSupport info) {
JTable target = (JTable)info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation)info.getDropLocation();
DefaultTableModel model = (DefaultTableModel)target.getModel();
int index = dl.getRow();
int max = model.getRowCount();
if(index<0 || index>max) index = max;
addIndex = index;
target.setCursor(Cursor.getDefaultCursor());
leftTable.setCursor(Cursor.getDefaultCursor());
try{
Object[] values = (Object[])info.getTransferable().getTransferData(leftTableFlavor);
if(source==target) addCount = values.length;
for(int i=0;i<values.length;i++) {
int idx = index++;
model.insertRow(idx, (Vector)values[i]);
target.getSelectionModel().addSelectionInterval(idx, idx);
}
return true;
}catch(UnsupportedFlavorException ufe) {
ufe.printStackTrace();
}catch(java.io.IOException ioe) {
ioe.printStackTrace();
}
return false;
}
}
class LeftTableTransferHandler extends TransferHandler {
@Override
protected Transferable createTransferable(JComponent c) {
JTable table = (JTable) c;
DefaultTableModel model = (DefaultTableModel)table.getModel();
return new DataHandler(model.getDataVector().elementAt(table.getSelectedRow()), leftTableFlavor.getMimeType());
}
@Override
public boolean canImport(TransferSupport info) {
return false;
}
@Override
public int getSourceActions(JComponent c) {
return COPY;
}
}
}