То, как я должен обнаружить тот столбец, переместилось, действие закончено в JTable? Я добавил columnModeListener к своей модели столбца, но проблемой является columnMoved метод, назван каждый раз, когда столбец перемещается (определенными пикселями). Я не хочу это поведение. Я просто хочу обнаружить, когда перетаскивание столбца закончено.
columnModel.addColumnModelListener(new TableColumnModelListener() {
public void columnAdded(TableColumnModelEvent e) {
}
public void columnRemoved(TableColumnModelEvent e) {
}
public void columnMoved(TableColumnModelEvent e) {
//this is called so many times
//I don't want this, but something like column moved finished event
System.out.println("Moved "+e.getFromIndex()+", "+e.getToIndex());
}
public void columnMarginChanged(ChangeEvent e) {
}
public void columnSelectionChanged(ListSelectionEvent e) {
}
});
Я надеюсь, что ясно, что я ищу. Спасибо.
Вот что я в итоге сделал. Я знаю, что это грязно, но это подходит для того, что я ищу:
boolean dragComplete = false;
apTable.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (dragComplete) {
System.out.println("Drag completed");
}
dragComplete = false;
}
});
columnModel.addColumnModelListener(new TableColumnModelListener() {
public void columnAdded(TableColumnModelEvent e) {
}
public void columnRemoved(TableColumnModelEvent e) {
}
public void columnMoved(TableColumnModelEvent e) {
dragComplete = true;
}
public void columnMarginChanged(ChangeEvent e) {
}
public void columnSelectionChanged(ListSelectionEvent e) {
}
});
Вот вот внутренний класс, который я использую, чтобы определить, когда заказывает столбец изменился. Обратите внимание, что пользователь может не отпустить мышь на данный момент, поэтому перетаскивание может продолжаться дальше.
private class ColumnUpdateListener implements TableColumnModelListener {
int lastFrom = 0;
int lastTo = 0;
private void verifyChange(int from, int to) {
if (from != lastFrom || to != lastTo) {
lastFrom = from;
lastTo = to;
///////////////////////////////////////
// Column order has changed! Do something here
///////////////////////////////////////
}
}
public void columnMoved(TableColumnModelEvent e) {
verifyChange(e.getFromIndex(), e.getToIndex());
}
public void columnAdded(TableColumnModelEvent e) {
verifyChange(e.getFromIndex(), e.getToIndex());
}
public void columnRemoved(TableColumnModelEvent e) {
verifyChange(e.getFromIndex(), e.getToIndex());
}
public void columnMarginChanged(ChangeEvent e) {}
public void columnSelectionChanged(ListSelectionEvent e) {}
}
Это хорошо для меня хорошо.
Если я вас правильно понимаю, возможно, вы хотите посмотреть на слушатели мыши. Может быть, событие Mouse_released?
Это может быть лучший подход:
table.setTableHeader(new JTableHeader(table.getColumnModel()) {
@Override
public void setDraggedColumn(TableColumn column) {
boolean finished = draggedColumn != null && column == null;
super.setDraggedColumn(column);
if (finished) {
onColumnChange(table); // Handle the event here...
}
}
});