友人の後輩からJButtonが押されたときにJButtonを点滅させたいができないという話を聞き、暇つぶしに実装してました。(本当はCのソースを読まなきゃイカンのだが...逃避)
テキトーにactionPerformedメソッド内でThread.sleep()とか使って再描写すればいいんじゃないかと思ったがどうもうまくいかん。最終的な出力結果が表示されるだけ。うまくいった人の例を見たが
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7415&forum=12&4
ちと複雑そうだし、しかもちらつくらしい。
んで同ページを読んでやっと分かったのだが、点滅等の定期処理をSwingでする場合、javax.swing.Timerを使うらしい。
以下、汚いソースをはっつける。
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
* BlinkButton
*
* ボタンの点滅test
*/
public class BlinkButton extends JFrame implements ActionListener {
/**
* serialVersionUID
のコメント
*/
private static final long serialVersionUID = 1L;
private boolean blinkFlag = true;
private JButton testButton = new JButton("test");
/**
* 初期設定を行います
*
* @param title
* タイトルバーにつける名前を設定します
*/
public BlinkButton(String title) {
super(title);
// 終了ボタン
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
// リスナーの追加
testButton.addActionListener(this);
getContentPane().add(testButton);
pack();
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
new BlinkButton("blink");
}
/**
* ボタンが押されたら点滅スタート
*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == testButton) {
Timer t = new Timer(1000, new TimerListener());
t.start();
}
}
//実際に点滅を行うクラス
private class TimerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (blinkFlag) {
changeColorPink();
} else {
changeColorWhite();
}
blinkFlag = !blinkFlag;
}
}
private void changeColorPink() {
testButton.setBackground(new Color(238, 145, 238));
}
private void changeColorWhite() {
testButton.setBackground(new Color(238, 238, 238));
}
}
インナークラスは切り分けちゃった方が綺麗かなぁ....。まぁやっつけ仕事ということで(;´Д`)
#ちなみにこの例だとボタンを押すたびにリスナーが生まれるのでクリックしまくるともの凄い勢いで点滅する。
コレの応用でアニメーション作成も可能。