今晩は。
車輪が回転するコードを作成しました。
エラ-は出ていませんが、車輪は回転しません。
宜しくご教示お願い致します。
このコードは、「Util.Timer」を使って周期的に動かそうとしていますが、
「Swing.Timer」を使って書き換えると問題なく動きました。
問題は「TimerTask」、「Timer」の箇所に原因がある
と考えていますが、どこをどのように修正すればよいのか分かりません。
詳しい方宜しくお願い致します。
//----------------------------------------------------
public class Kanran_Frame extends JFrame
{
public Kanran_Frame( )
{
Container cnt = this.getContentPane() ;
cnt.setBackground( Color.black ) ;
this.setSize( 800 , 600 ) ;
this.setLayout( null ) ;
Kanran_Panel1 k_can1 = new Kanran_Panel1() ;
k_can1.setLayout( null ) ;
k_can1.setSize( 350 , 350 ) ;
cnt.add( k_can1 ) ;
Timer timer = new Timer() ;
timer.schedule( ( new MyTimer() ) , 500 , 1000 ) ;
}
public static void main( String[] args )
{
Toolkit.getDefaultToolkit().setDynamicLayout( true ) ;
new Kanran_Frame() ;
( new Kanran_Frame() ).setVisible( true ) ;
}
}
//---------------------------------------------------------
public class Kanran_Panel1 extends JPanel
{
int x , y ;
int xc = 200 ;
int yc = 200 ;
double hankei = 100.0 ;
double kakudo ;
int rr = 0 ;
Graphics2D g2 ;
public Kanran_Panel1( )
{
this.setLocation( 300 , 0 ) ;
this.setBackground( Color.black ) ;
}
public void paintComponent( Graphics g )
{
super.paintComponent( g ) ;
g2 = (Graphics2D) g ;
System.out.println( "rr_00 =" + rr ) ;
g2.rotate( rr * Math.PI / 180 , xc , yc ) ;
//Outer CicleLine
g2.setColor( Color.GREEN ) ;
g2.drawOval( 100 , 100 , 200 , 200 ) ;
//Frame
for( kakudo = 0.0 ; kakudo < 360 ; kakudo += 20.0 )
{
x = xc + (int)( hankei * Math.cos( Math.toRadians( kakudo ) ) ) ;
y = yc + (int)( hankei * Math.sin( Math.toRadians( kakudo ) ) ) ;
g2.drawLine( xc , yc , x , y ) ;
}
}
public void move()
{
rr = ++rr % 360 ;
System.out.println( "rr_11 =" + rr ) ;
}
}
//-----------------------------------------------------------------
public class MyTimer extends TimerTask
{
Kanran_Panel1 kp1 ;
public MyTimer()
{
kp1 = new Kanran_Panel1() ;
}
@Override
public void run( )
{
kp1.move() ;
kp1.repaint() ;
}
}
//----------------------------------------------------------------
No.1
- 回答日時:
質問から何日か経っていますが解決したでしょうか?
念のため、気がついたところを指摘しておきます。
まず、回転しない原因ですが、これは、Kanran_Panel1のインスタンスが2つ作られ、一つが回転しないで表示され、もう一つが表示されずに回転しているせいです。
new Kanran_Panel1() が2か所にあります。
public Kanran_Frame( )の中で作られたものが表示されて、public MyTimer()の中で作られたものが表示されずに回転しています。
修正案としては、Kanran_Frame( )で作ったKanran_Panel1のインスタンスをMyTimer()に渡すやり方があります。
public Kanran_Frame( )の中の
timer.schedule( ( new MyTimer() ) , 500 , 1000 ) ;
を
timer.schedule( ( new MyTimer(k_can1) ) , 500 , 1000 ) ;
に変更し、さらに、
public MyTimer()
{
kp1 = new Kanran_Panel1() ;
}
を
public MyTimer(Kanran_Panel1 p)
{
kp1 = p;
}
に変更します。
これでとりあえず回転するようになると思います。
もう一つ問題になるのが、mainメソッドの中の、
new Kanran_Frame() ;
( new Kanran_Frame() ).setVisible( true ) ;
の部分です。
これでは、Kanran_Frameが2つ作られ1つが表示されていますので、
( new Kanran_Frame() ).setVisible( true ) ;
だけにしてください。
さらにもう一つ、このままでは、表示されたKanran_Frameの右上の閉じるボタンをクリックしても、フレームは閉じますが、タイマーは動いたまま残ります。
とりあえずこのアプリケーションを終了させてしまえばいいのであれば、Kanran_Frame( )の中の
this.setLayout(null);の次の行あたりに
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
を入れておきます。
takashi8842さん、回答有難う御座いました。
まさにご指摘の通りで、
====どのようにして「MyTimer」の 「run( )メソッドの内容」を
「timer.schedule」に渡してやるのか====
が理解出来ず、悩んでいました。
本当に有難う御座いました、今回の回答で少し理解することが出
来ました。
ところで実際に動かしてみると、その出力内容に疑問なのですが、
以下のようになります。
スレッドの内容が、
プログラム作成直後には、「rr_00」の出力をせずに
「rr_11」からの 出力となり、その後「rr_00」が出力されます。
しかし、「rr_00 =359」以降には、「rr_00」から(正常に?)
出力されます。
これがスレッド正常な動作でしょうか。
スレッドの正常な動作とはこのようなものなのでしょうか。
それとも何かの原因があるのでしょうか。
宜しくお願い致します。
=============================
rr_11 =1
rr_11 =2
rr_11 =3
rr_11 =4
rr_11 =5
rr_11 =6
rr_11 =7
rr_11 =8
rr_11 =9
rr_11 =10
rr_11 =11
rr_00 =11
rr_11 =12
rr_11 =13
rr_11 =14
rr_00 =14
rr_11 =15
rr_00 =15
rr_11 =16
rr_00 =16
//・・・・・・・・・・
rr_00 =354
rr_11 =355
rr_00 =355
rr_11 =356
rr_00 =356
rr_11 =357
rr_00 =357
rr_11 =358
rr_00 =358
rr_11 =359
rr_00 =359
rr_11 =0
rr_00 =0
rr_11 =1
rr_00 =1
rr_11 =2
rr_00 =2
rr_11 =3
rr_00 =3
rr_11 =4
rr_00 =4
rr_11 =5
rr_00 =5
rr_11 =6
rr_00 =6
rr_11 =7
rr_00 =7
rr_11 =8
rr_00 =8
rr_11 =9
rr_00 =9
rr_11 =10
rr_00 =10
No.2ベストアンサー
- 回答日時:
No.1です。
「rr_00」が抜けるということは、paintComponentが呼び出されていないということです。
kp1.repaint() を実行したからといって、必ずしもpaintComponentが呼び出されるとは限りません。
APIのドキュメントによると、
http://docs.oracle.com/javase/jp/8/docs/api/java …
「このメソッドはこのコンポーネントのpaintメソッドをできるだけ早く呼び出します。」
とあります。
repaint自体は、再描画のリクエストを出すだけで、実際の再描画は状況によっては遅延される可能性があります。
何かの処理が重くて、タイマーでrunを呼び出すタイミングに追い付かないときは、paintComponentが呼び出されず、何回かのrepaintがまとめられて1回のpaintComponent呼び出しになってしまうのでしょう。
多分、最初にフレーム等を生成・表示する処理に手間取って、最初だけ飛ばされてしまうのかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java final 1 2022/06/10 22:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリから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を何度も呼ぶには
おすすめ情報