![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
今日は、スレッドがうまく動作しません、宜しくお願いします。
パネルに車輪を描画し、その車輪を回転させ、フレームに貼付けます。
パネルの車輪を回転させながら、更にそのパネルを下に移動させる
スレッドを書きましたが、うまく動作しません。
車輪の回転、パネルの移動のそれぞれの単独なら、どちらも正常に
動作しますが、両方を同時に動かそうとすると、パネルが移動するだけです。
2本のスレッドをうまくコントロール出来ていないのが原因だろうと考えて
いますが、複数のスレッドをどのようにコントロールするのか分かりません。
詳しい方宜しくご教示宜しくお願い致します。
//---------------------------------------------------------------------
//フレーム
public class Kanran_Frame extends JFrame
{
Kanran_Panel1 k_can1 ;
Timer timer = new Timer() ;
public Kanran_Frame( )
{
this.setDefaultCloseOperation( EXIT_ON_CLOSE ) ;
Container cnt = this.getContentPane() ;
this.setSize( 1000 , 900 ) ;
this.setLayout( null ) ;
k_can1 = new Kanran_Panel1() ;
k_can1.setLayout( null ) ;
k_can1.setSize( 350 , 350 ) ;
cnt.add( k_can1 ) ;
//上下移動
timer.schedule( new MyRunnable( k_can1 ) , 0 , 10 ) ;
//回転
// timer.schedule( new MyTimer( k_can1 ) , 0 , 10 ) ;
}
public static void main( String[] args )
{
Toolkit.getDefaultToolkit().setDynamicLayout( true ) ;
Kanran_Frame kf = new Kanran_Frame() ;
kf.setVisible( true ) ;
}
}
//-------------------------------------------------
//描画用パネル
class Kanran_Panel1 extends JPanel
{
int x , y ;
int xc = 200 ;
int yc = 200 ;
double hankei = 100.0 ;
double kakudo ;
int rr ;
Graphics2D g2 ;
public Kanran_Panel1( )
{
this.setBackground( Color.magenta ) ;
}
public void paintComponent( Graphics g )
{
super.paintComponent( g ) ;
g2 = (Graphics2D)g ;
// rotatetion Panel
g2.rotate( rr * Math.PI / 180 , xc , yc ) ;
//Outer Circle Line
g2.setColor( Color.GREEN ) ;
g2.drawOval( 100 , 100 , 200 , 200 ) ;
g2.setColor( Color.magenta ) ;
g2.drawOval( 101 , 101 , 198 , 198 ) ;
g2.setColor( Color.orange ) ;
g2.drawOval( 102 , 102 , 196 , 196 ) ;
//Scue Arm Line //Backets
for( kakudo = 0.0 ; kakudo < 360 ; kakudo += 20.0 )
{
//Scue Aim Line
x = xc + (int)( hankei * Math.cos( Math.toRadians( kakudo ) ) ) ;
y = yc + (int)( hankei * Math.sin( Math.toRadians( kakudo ) ) ) ;
g2.drawLine( xc , yc , x , y ) ;
//Backets
g2.fillRect( x - 5 , y - 2 , 11 , 11 ) ;
}
}
}
//-------------------------------------------------
//updown
class MyRunnable extends TimerTask
{
Kanran_Panel1 kp1 ;
int updown = 0 ;
int x0 = 600 ;
MyRunnable( Kanran_Panel1 thr )
{
kp1 = thr ;
}
public void run( )
{
while( updown <= 500 )
{
updown = updown += 1 ;
kp1.setLocation( x0 , updown ) ;
try
{
Thread.sleep( 10 ) ;
}
catch( InterruptedException e ) {}
}
}
}
//-------------------------------------------------
//回転
class MyTimer extends TimerTask
{
Kanran_Panel1 kp1 ;
public MyTimer( Kanran_Panel1 p )
{
kp1 = p ;
}
public void run( )
{
kp1.rr = ++ kp1.rr % 360 ;
kp1.repaint() ;
}
}
//-------------------------------------------------
No.4ベストアンサー
- 回答日時:
># Timerのインスタンスを複数作るとは、
> 具体的には、
> 「timer.schedule( new MyRunnable( k_can1 ) , 0 , 10 ) ;
> timer.schedule( new MyTimer( k_can1 ) , 0 , 10 ) ;」
そのまんまですよ。
Timer timer1 = new Timer(true);
Timer timer2 = new Timer(true);
// 上下移動
timer1.schedule(new MyRunnable(k_can1), 0, 10);
// 回転
timer2.schedule( new MyTimer( k_can1 ) , 0 , 10 ) ;
こんなかんじ。試してないけど多分動きます。
tknakamuriさん、回答有難う御座いました。
正常に動きました。
本当に有難う御座いました。
今後とも宜しくお願いします。
No.3
- 回答日時:
>#Timerで2個のスレッドを走らせることは出来ないのでしょうか。
TimerのJavadocに
>各 Timer オブジェクトと対応するのは、
>タイマーのタスクをすべて連続して実行するために使用される、
>単一のバックグラウンドスレッドです。
と書いてあるので無理でしょう。
Timerのインスタンスを複数作れば済む話では?
No.2
- 回答日時:
>他に思い当たる原因はあるのでしょうか。
そもそも Timer ってスレッド1個しか作らないからかな。
一個のTimer だと順番に登録されたタスクを
実行するだけだと思います。
いずれにしれも GUI の操作をバックグラウンドスレッドから
行うのは厳禁。
tknakamuriさん、回答ありがとうございます。
>そもそも Timer ってスレッド1個しか作らないからかな。
#Timerで2個のスレッドを走らせることは出来ないのでしょうか。
web等のサイトを参考にしましたが、複数のスレッドを走らせているよう に見えるのですが、私の勘違いなのでしょうか。
Threadクラスを使って書き換えてやる必要があるということでしょうか。
宜しくお願いします。
No.1
- 回答日時:
Swingが素人なんですが(javaFXや .NET や AndroidやWindowsしか
しらない)、
一般的にGraphicsの描画処理に複数のスレッドを使うのは非常識では?
他のライブラリでは、スレッドを使うにしても、最終的な描画処理は
描画専用スレッドにイベントを引き渡すのが普通だと思います。
そのためのユーティリティクラスやメソッドが用意されているのが
普通です。
Swingにもそういうのがあるのでは?
SwingUtilities.invokeLater
あたりそれっぽいと思います。あくまで素人のあてずっぽうですが。。。
tknakamuriさん、回答有難う御座います。
コードを変更してみましたが、結果は同じでした。
他に思い当たる原因はあるのでしょうか。
(文字数オーバのため、一部省略しています。)
宜しくお願いします。
---------------------------------------------------------------
public class Kanran_Frame extends JFrame
{
static Kanran_Panel1 k_can1 ;
static Timer timer = new Timer() ;
public Kanran_Frame( )
{
・
・
・
}
public static void main( String[] args )
{
Toolkit.getDefaultToolkit().setDynamicLayout( true ) ;
SwingUtilities.invokeLater
(
new Runnable()
{
public void run()
{
Kanran_Frame kf = new Kanran_Frame() ;
kf.setVisible( true ) ;
//上下移動
timer.schedule( new MyRunnable( k_can1 ) , 0 , 10 ) ;
//回転
timer.schedule( new MyTimer( k_can1 ) , 0 , 10 ) ;
}
}
) ;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vc++ 2005 Pictureboxの透過処理
-
C#で、あるクラスのメンバーす...
-
ボタンの複数割り当てについて
-
C#でのWNetAddConnection3の使...
-
コンボボックスを使う時の警告
-
C#でのDLLのメソッドの作り方
-
Junitテストでvoid戻り値メッソ...
-
JWindow、JFrameでモーダル化の...
-
数独の問題作成
-
アプレットでマウスイベントが...
-
【C#】ハッシュテーブル(連想...
-
オブジェクトの中のプロパティ...
-
IF関数でEmpty値を設定する方法。
-
javaで質問です。 文字列2023/2...
-
カタカナの小文字を大文字に変...
-
分を表す数値(int型)を、小数...
-
ページング
-
ループ処理の際、最後だけ","を...
-
ArrayListの要素数の上限
-
配列にnullを代入すると、null...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
ボタンの複数割り当てについて
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# visibleプロパティをfalseに...
-
ボタンのイベントで異なるウィ...
-
C# DataGridView列カスタマイズ
-
C# 矢印キーの取得
-
Processingでマウスクリックで...
-
[C#.net]スレッド化された別フ...
-
C#で別のFormへ複数の値を返そ...
-
C# WinForm のDataGridView Cel...
-
テキストフィールドに入力した...
-
【C#】ソースコードをファイル...
-
C#から、C++で作成したdll内の...
-
C# 半角カナの文字化けについて
-
C# タスクバーを隠したフォーム...
-
文字列の置換
-
エンターキーを押すとOKボタン...
おすすめ情報
tknakamuriさん、回答有難う御座います。
>Timerのインスタンスを複数作れば済む話では?
# Timerのインスタンスを複数作るとは、
具体的には、
「timer.schedule( new MyRunnable( k_can1 ) , 0 , 10 ) ;
timer.schedule( new MyTimer( k_can1 ) , 0 , 10 ) ;」
をどのように、書き換えてやればいいのでしょうか。
宜しくお願い致します。