• category: swing folder: SlideTableRows title: JTableで行の追加、削除アニメーション tags: [JTable, Animation] author: aterai pubdate: 2009-04-06T14:03:11+09:00 description: JTableの行追加や削除をスライドアニメーションで強調します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTTP0i2yxI/AAAAAAAAAkE/DQKpmn3BIQo/s800/SlideTableRows.png hreflang:
       href: http://java-swing-tips.blogspot.com/2009/04/animating-jtable-rows.html
       href: https://java-swing-tips.blogspot.com/2009/04/animating-jtable-rows.html
       lang: en

概要

概要

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

サンプルコード

サンプルコード

#spandel
private void testCreateActionPerformed(ActionEvent e) {
#spanend
  model.addTest(new Test("New name", ""));
  (new Timer(DELAY, new ActionListener() {
    int i = table.convertRowIndexToView(model.getRowCount() - 1);
    int h = START_HEIGHT;
    @Override public void actionPerformed(ActionEvent e) {
      if (h < END_HEIGHT) {
        table.setRowHeight(i, h++);
      }else{
        ((Timer) e.getSource()).stop();
      }
#spanadd
public void createActionPerformed(JTable table, DefaultTableModel model) {
#spanend
  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();
  }).start();
}

#spandel
private void deleteActionPerformed(ActionEvent evt) {
#spanend
  final int[] selection = table.getSelectedRows();
  if (selection == null || selection.length <= 0) return;
  (new Timer(DELAY, new ActionListener() {
    int h = END_HEIGHT;
    @Override public void actionPerformed(ActionEvent e) {
      h--;
      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]));
        }
#spanadd
public void deleteActionPerformed(JTable table, DefaultTableModel model) {
#spanend
  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();
  }).start();
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、javax.swing.Timerを使用して、徐々に行の高さを変更することで、アニメーションを行っています。

解説

上記のサンプルでは、javax.swing.Timerを使用して徐々に行の高さを拡大、または縮小することで、追加と削除のアニメーションを行っています。
  • 追加
    • 行を追加したあとで、JTable#setRowHeight(int, int)メソッドを使用して追加された行の高さを変更
  • 行の追加アニメーション
    • 高さ0の行を追加したあとJTable#setRowHeight(int, int)メソッドを使用してその高さをデフォルトの高さになるまで拡大
  • 行の削除アニメーション
    • 選択された行の高さをJTable#setRowHeight(int, int)メソッドを使用して縮小
    • 高さが一定以下になったらその行を削除
  • 削除
    • 選択された行の高さを、JTable#setRowHeight(int, int)メソッドを使用して変更
    • 高さが一定以下になったら、選択されていた行を削除

参考リンク

参考リンク

コメント

コメント