Swing/SlideTableRows のバックアップの現在との差分(No.1)
TITLE:JTableで行の追加、削除アニメーション
Posted by terai at 2009-04-06
JTableで行の追加、削除アニメーション
JTableの行追加や削除をスライドアニメーションで強調します。-
category: swing
folder: SlideTableRows
title: JTableで行の追加、削除アニメーション
tags: [JTable, Animation]
author: aterai
pubdate: 2009-04-06T14:03:11+09:00
description: JTableの行追加や削除をスライドアニメーションで強調します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2009/04/animating-jtable-rows.html lang: en
概要
JTable
の行追加や削除をスライドアニメーションで強調します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
private void testCreateActionPerformed(ActionEvent e) {
#spanend
model.addTest(new Test("New name", ""));
(new javax.swing.Timer(DELAY, new ActionListener() {
int i = table.convertRowIndexToView(model.getRowCount()-1);
int h = START_HEIGHT;
public void actionPerformed(ActionEvent e) {
if(h<END_HEIGHT) {
table.setRowHeight(i, h++);
}else{
((javax.swing.Timer)e.getSource()).stop();
}
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#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
#spanend
#spandel
private void deleteActionPerformed(ActionEvent evt) {
#spanend
final int[] selection = table.getSelectedRows();
if(selection==null || selection.length<=0) return;
(new javax.swing.Timer(DELAY, new ActionListener() {
int h = END_HEIGHT;
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{
((javax.swing.Timer)e.getSource()).stop();
for(int i=selection.length-1;i>=0;i--)
model.removeRow(table.convertRowIndexToModel(selection[i]));
#spanadd
#spanend
#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();
}
解説
上記のサンプルでは、javax.swing.Timerを使用して、徐々に行の高さを変更することで、アニメーションを行っています。解説
上記のサンプルでは、javax.swing.Timer
を使用して徐々に行の高さを拡大、または縮小することで、追加と削除のアニメーションを行っています。
- 追加
- 行を追加したあとで、setRowHeight(int, int)メソッドを使用して追加された行の高さを変更
- 行の追加アニメーション
- 高さ
0
の行を追加したあとJTable#setRowHeight(int, int)
メソッドを使用してその高さをデフォルトの高さになるまで拡大
- 高さ
- 行の削除アニメーション
- 選択された行の高さを
JTable#setRowHeight(int, int)
メソッドを使用して縮小 - 高さが一定以下になったらその行を削除
- 選択された行の高さを
- 削除
- 選択された行の高さを、setRowHeight(int, int)メソッドを使用して変更
- 高さが一定以下になったら、選択されていた行を削除