餃子を食べるとき、何をつけますか?

先日javaの勉強をはじめた初心者なのですが、javaのマウスイベントやキーイベントを同時にやろうとすると重くなってしまいます。
例えば、
テトリスのようなブロックがあり、
そのどれかを選んでマウスのカーソルに合わせて既存のマス目のある(14*14)ボード上に表示して、
上キーを押すと反転、左右キーを押すと押した方向に90度回転、
するという一連の動作に

1.ボタンにブロックの絵を表示してどれかを選ぶことでActionListenerを使って、イベントを実行して、
2.そのActionEventの中でMouseListenerを使ってMouseEnteredとMouseExitedを実行して、カーソルの位置の移動に合わせて、ボード上に選んだブロックを表示して、
3.更に、それらができてる状態で、KeyListenerからのKeyPressedで、上左右キーを押すことで任意の方向に回転できるようにしたくて

2までは、どうにか無駄な記述も多々あるだろうけどできました、が、3の記述をして、実行するととても重くなってしまいます。

あと、1,2の段階でほかのブロックを選びなおそうとしても、とたんに重くなってしまいます。

結構初心者の自分にとっては複雑な構造をしていて、たぶん無駄な記述が多くなってしまったり、Listenerの記述のタイミングが悪かったりなどが原因だと考えているのですが、
まったく解決方法が思いつきません。

あと、ブロックを選択してから、ボード上にマウスカーソルを移動して、カーソルの位置に合わせて選んだブロックを表示したいと書いてありましたが、
ボードにカーソルを移動したとたんに、以下のようなエラー?が大量発生します

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.awt.AWTEventMulticaster.mouseExited(Unknown Source)
at java.awt.AWTEventMulticaster.mouseExited(Unknown Source)
at java.awt.AWTEventMulticaster.mouseExited(Unknown Source)
以下ほぼ無限ループ。

簡単なlisetenerとeventの使い方しか勉強していないので、さっぱりでございます。
たぶんこのエラーも重くなっている原因の一つだとおもっていますが、、、、、、、、

詳しい方、エラー含め、解決方法、改善方法等、教えていただけませんでしょうか??
情報不足だった場合、必要な物を教えていただければ、わかる範囲で追記します。
ヒントでも推測でもいいです。ここまで来て挫けたくないです><。
助けてください~><。

A 回答 (1件)

>javaのマウスイベントやキーイベントを同時にやろうとすると...


>2.そのActionEventの中でMouseListenerを使ってMouseEnteredとMouseExitedを実行して、カーソルの位置の移動に合わせて、ボード上に選んだブロックを表示して
>StackOverflowError

上記から判断してイベント処理について勘違いをされている気がします。ActionListener等のハンドラー内からMouseEventなどのイベントを自分で発行したり再描画のためにpaintメソッドやpaintComponentメソッドを直接呼び出したりしていないでしょうか?

もしそうだとしたらそのような処理方法は間違いです。
何かのイベントが発生した際は表示対象(例えばブロック)の状態(表示そのものではなく表示を決める元の情報)変更して表示用コンポーネントのrepaint()メソッドを呼び出したら即座にreturnします。表示用コンポーネントでは単純にpaintComponentメソッドで表示対象の現在の状態を画面へ表示(再描画)するだけです。

具体的にはアニメーションの例が載っているページが色々あると思うのでそれらを参考にしつつもう少し簡単なものから取り組まれるとよいと思います。

この回答への補足

回答ありがとうございます。
仰る通り、だいぶ無知なためか、勘違いしている所が多々あるかもしれません。

実際、
○○Listenerに対応した操作があると、event(MousueListenerだった場合、MouseExitedなど)の関数が実行される。
しか大雑把に理解しておりませんでした。

その知識だけであとは好き勝手記述していたので、いまでは訳が分からなくなってしまいました笑。
この状況で正しい回答をいただいても、それすらちゃんと理解できないかもしれませんね。。。
もっと詳しく勉強しなおします!
ありがとうございました。

補足日時:2014/12/17 13:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報