Столбец перемещенное [законченное] событие в JTable

То, как я должен обнаружить тот столбец, переместилось, действие закончено в 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) {
            }
        });

Я надеюсь, что ясно, что я ищу. Спасибо.

11
задан ashokgelal 29 January 2010 в 17:46
поделиться

4 ответа

Вот что я в итоге сделал. Я знаю, что это грязно, но это подходит для того, что я ищу:

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) {
            }
        });
14
ответ дан 3 December 2019 в 05:12
поделиться

Вот вот внутренний класс, который я использую, чтобы определить, когда заказывает столбец изменился. Обратите внимание, что пользователь может не отпустить мышь на данный момент, поэтому перетаскивание может продолжаться дальше.

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) {}

}

Это хорошо для меня хорошо.

4
ответ дан 3 December 2019 в 05:12
поделиться

Если я вас правильно понимаю, возможно, вы хотите посмотреть на слушатели мыши. Может быть, событие Mouse_released?

0
ответ дан 3 December 2019 в 05:12
поделиться

Это может быть лучший подход:

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...
        }
      }
    });
3
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: