import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TableDemo extends JPanel {
private String[] columnNames;
private Object[][] data;
private JTable table;
private SortedSet<Integer> selectedCells;
private boolean dragging;
public TableDemo() {
setLayout(new BorderLayout());
columnNames = new String[]{"First Name", "Last Name", "Sport",
"# of Years", "Vegetarian"};
data = new Object[][]{
{"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)},
{"Campione", "Milne", "Pool", new Integer(10), new Boolean(false)},
{"Philip", "Knitting", "Pool", new Integer(10), new Boolean(false)},
{"Snowboarding", "Milne", "Walrath", new Integer(10), new Boolean(false)},
{"Walrath", "Philip", "Knitting", new Integer(10), new Boolean(false)}};
selectedCells = new TreeSet<Integer>();
table = new JTable(data, columnNames) {
@Override
public boolean isCellSelected(final int row, final int column) {
if (dragging) {
return super.isCellSelected(row, column);
}
int n = row * 1000 + column;
return selectedCells.contains(n);
}
};
MouseAdapter mouseHandler = new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent me) {
if (SwingUtilities.isLeftMouseButton(me)) {
if (!me.isControlDown()) {
selectedCells.clear();
}
Point p = me.getPoint();
int row = table.rowAtPoint(p);
int col = table.columnAtPoint(p);
int n = row * 1000 + col;
if (selectedCells.contains(n)) {
selectedCells.remove(n);
} else {
selectedCells.add(n);
}
}
}
@Override
public void mouseDragged(final MouseEvent me) {
if (!me.isControlDown()) {
selectedCells.clear();
dragging = true;
}
}
@Override
public void mouseReleased(final MouseEvent me) {
if (dragging) {
completeSelections();
dragging = false;
}
showSelections();
}
private void completeSelections() {
if (selectedCells.isEmpty()) {
//Durch Ziehen mit der Maus wurde ein Bereich
//in der JTable ausgewählt:
int[] rows = table.getSelectedRows();
int[] cols = table.getSelectedColumns();
for (int i = 0; i < rows.length; i++) {
for (int j = 0; j < cols.length; j++) {
int row = rows[i];
int col = cols[j];
int n = row * 1000 + col;
selectedCells.add(n);
}
}
}
}
};
table.addMouseListener(mouseHandler);
table.addMouseMotionListener(mouseHandler);
table = tableConfig(table);
add(new JScrollPane(table));
}
private JTable tableConfig(final JTable tbl) {
tbl.setCellSelectionEnabled(true);
tbl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
return tbl;
}
private void showSelections() {
for (Integer n : selectedCells) {
int row = n / 1000;
int col = n - row * 1000;
System.out.println("row:" + row + ", col:" + col);
}
System.out.println("");
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new TableDemo());
frame.pack();
frame.setVisible(true);
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
public void run() {
createAndShowGUI();
}
};
SwingUtilities.invokeLater(gui);
}
}