勉強を始めたばかりなので稚拙な質問ですがお許しください。
ユーザーからの入力→repaint→画面に反映→プログラムが処理→repaint→画面に反映
というターン制のような動かし方をしたいのですが、実際にはユーザーの入力の後、プログラムの処理を待ってからまとめてrepaintしてしまいます。
repaint()は再描画を要求しているだけに過ぎず、repaint()と書いた場所で即時に再描画されるわけではないそうですが、では具体的にすぐ再描画してほしい場合はどうすればいいのでしょうか?
例えばですが、「ボタンを押すとcountの値が+1され、四角がcount個描画される。その一秒後に、こちらが何もしなくてもcountが+2されてもう一度四角がcount個(つまりこの時点で合計三個)描画される」というのを作ってみました。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class question extends Applet implements ActionListener{
Button bt1;
int count = 0;
public void init(){
bt1 = new Button("start");
add(bt1);
bt1.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bt1) {
bt1.setEnabled(false);
count += 1;
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
}
count += 2;
repaint();
bt1.setEnabled(true);
}
}
public void paint(Graphics g){
for(int i = 0; i < count; i++){
g.drawRect(10, 10, 10 + i * 5, 10 + i * 5);
}
}
}
これではボタンを押すたびに3つずつ四角が増えているように外見上見えてしまいます。
ボタンを押すとしっかり1つ四角を表示してから一秒待って、2つ四角を増やす。という風にするためにはどうすればよいのでしょうか? どなたかご教示ください。
ちなみにpaintImmediatelyというものを見つけましたが、何故か使えず……(メソッドpaintImmediatelyは未定義ですと言われてしまう)
No.1ベストアンサー
- 回答日時:
ひとつのイベントハンドラの中でスリープして2回に分けても
ひとつにまとめられてしまうというのはありそうなことです。
それにイベントハンドラの中でスリープするのはよくないです。
Swing Timerを使って、こんなふうにしてはどうでしょう。
http://ideone.com/y0mQ5
期待通りに動きましたよ。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
public class question extends Applet implements ActionListener{
Button bt1;
int count = 0;
Timer timer;
public void init(){
bt1 = new Button("start");
add(bt1);
bt1.addActionListener(this);
timer = new Timer(1000, this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bt1) {
bt1.setEnabled(false);
count += 1;
repaint();
timer.start();
} else if (e.getSource() == timer) {
count += 2;
repaint();
bt1.setEnabled(true);
timer.stop();
}
}
public void paint(Graphics g){
for(int i = 0; i < count; i++){
g.drawRect(10, 10, 10 + i * 5, 10 + i * 5);
}
}
}
参考URL:http://ideone.com/y0mQ5
おお、まさにこんな感じに動かしたかったのです!
swingにtimerというものがあるんですね、便利そうです。
swing timerで調べてみると色々なサンプルがあったので、これらも参考にしつつ作っていきたいと思います。
イベントハンドラ内のスリープが推奨されない理由も、調べてみて少し分かったような気持ちになりました。EDTがsleep中になってしまうと、例えばもう一度ボタンを押したとき固まったような感じになってしまうわけですね。
色々と本当にありがとうございます!まだまだひよっこですが、頑張ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Junitテストでvoid戻り値メッソ...
-
Java ボールが動くアニメーション
-
C# タスク非表示でタイトルバー...
-
struts2のchainで値の受け渡し...
-
Processingでマウスクリックで...
-
デスクトップマスコットのドラ...
-
JWindow、JFrameでモーダル化の...
-
ペイントソフトを作っているの...
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
-
シャットダウンフックが呼ばれない
-
EXCEL VBA で、0から?1から?
-
テキストボックスに入力された...
-
べき乗
-
グレイコードの変換
-
C# ListBoxのインデックスの値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
Thread.sleepのInterruptedExce...
-
unityでのC++エラーの原因がわ...
-
C#で別のFormへ複数の値を返そ...
-
C# visibleプロパティをfalseに...
-
エンターキーを押すとOKボタン...
-
Processingでマウスクリックで...
-
[C#.net]スレッド化された別フ...
-
C#でキーイベントが発生しない...
-
C# DataGridView列カスタマイズ
-
【C#】ソースコードをファイル...
-
LVM_SETITEMSTATEでListViewの...
-
GetDIBits関数の使い方について
-
未割り当てのローカル変数
-
C# MouseHoverを何度も呼ぶには
おすすめ情報