概要

JTableの行追加や削除をスライドアニメーションで強調します。

サンプルコード

public void createActionPerformed(JTable table, DefaultTableModel model) {
  model.addRow(new Object[] {"New name", model.getRowCount(), false});
  int index = table.convertRowIndexToView(model.getRowCount() - 1);
  AtomicInteger height = new AtomicInteger(START_HEIGHT);
  new Timer(DELAY, e -> {
    int h = height.getAndIncrement();
    if (h < END_HEIGHT) {
      table.setRowHeight(index, h);
    } else {
      ((Timer) e.getSource()).stop();
    }
  }).start();
}

public void deleteActionPerformed(JTable table, DefaultTableModel model) {
  int[] selection = table.getSelectedRows();
  if (selection.length == 0) {
    return;
  }
  AtomicInteger height = new AtomicInteger(END_HEIGHT);
  new Timer(DELAY, e -> {
    int h = height.getAndDecrement();
    if (h > START_HEIGHT) {
      for (int i = selection.length - 1; i >= 0; i--) {
        table.setRowHeight(selection[i], h);
      }
    } else {
      ((Timer) e.getSource()).stop();
      for (int i = selection.length - 1; i >= 0; i--) {
        model.removeRow(table.convertRowIndexToModel(selection[i]));
      }
    }
  }).start();
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、javax.swing.Timerを使用して徐々に行の高さを拡大、または縮小することで、追加と削除のアニメーションを行っています。

  • 行の追加アニメーション
    • 高さ0の行を追加したあとJTable#setRowHeight(int, int)メソッドを使用してその高さをデフォルトの高さになるまで拡大
  • 行の削除アニメーション
    • 選択された行の高さをJTable#setRowHeight(int, int)メソッドを使用して縮小
    • 高さが一定以下になったらその行を削除

参考リンク

コメント