selection handlers

This commit is contained in:
Konstantin Bulenkov
2012-04-13 17:05:11 +02:00
parent 05b1e97db8
commit 12cf6f2c59
4 changed files with 61 additions and 0 deletions
@@ -44,4 +44,14 @@ public class FixedColumnsModel extends MultiColumnListModel {
final int columns = getColumnCount();
return columns == 0 ? -1 : row * columns + column;
}
@Override
public int getColumn(int listIndex) {
return listIndex % myMaxColumns;
}
@Override
public int getRow(int listIndex) {
return listIndex / myMaxColumns;
}
}
@@ -44,4 +44,14 @@ class FixedRowsModel extends MultiColumnListModel {
final int rows = getRowCount();
return rows == 0 ? -1 : column * rows + row;
}
@Override
public int getColumn(int listIndex) {
return listIndex / myMaxRows;
}
@Override
public int getRow(int listIndex) {
return listIndex % myMaxRows;
}
}
@@ -19,6 +19,7 @@ import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.KeyEvent;
/**
* @author Konstantin Bulenkov
@@ -60,6 +61,44 @@ public class MultiColumnList extends JTable {
getColumnModel().setColumnMargin(0);
}
@Override
protected void processKeyEvent(KeyEvent e) {
final int key = e.getKeyCode();
final int col = getSelectedColumn();
final int row = getSelectedRow();
final MultiColumnListModel model = getModel();
int r = row;
int c = col;
if (key == KeyEvent.VK_RIGHT) {
if (c + 1 < getColumnCount()) {
c++;
}
} else if (key == KeyEvent.VK_DOWN) {
if (r + 1 < getRowCount()) {
r++;
if (model.toListIndex(r, c ) >= model.getSize()) {
r = 0; c++;
}
} else {
r = 0; c++;
}
}
if (col != c || row != r) {
if (e.getID() == KeyEvent.KEY_RELEASED) return;
int index = model.toListIndex(r, c);
if (index >= model.getSize() || r >= getRowCount() || c >= getColumnCount()) {
e.consume();
final int last = model.getSize() - 1;
changeSelection(model.getRow(last), model.getColumn(last), false, false);
} else {
changeSelection(r, c, false, false);
e.consume();
}
} else {
super.processKeyEvent(e);
}
}
public MultiColumnList(Object...elements) {
this(createListModel(elements));
}
@@ -32,6 +32,8 @@ public abstract class MultiColumnListModel extends AbstractTableModel implements
}
public abstract int toListIndex(int row, int column);
public abstract int getColumn(int listIndex);
public abstract int getRow(int listIndex);
public int getSize() {
return myModel.getSize();