先日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の使い方しか勉強していないので、さっぱりでございます。
たぶんこのエラーも重くなっている原因の一つだとおもっていますが、、、、、、、、
詳しい方、エラー含め、解決方法、改善方法等、教えていただけませんでしょうか??
情報不足だった場合、必要な物を教えていただければ、わかる範囲で追記します。
ヒントでも推測でもいいです。ここまで来て挫けたくないです><。
助けてください~><。
No.1ベストアンサー
- 回答日時:
>javaのマウスイベントやキーイベントを同時にやろうとすると...
>2.そのActionEventの中でMouseListenerを使ってMouseEnteredとMouseExitedを実行して、カーソルの位置の移動に合わせて、ボード上に選んだブロックを表示して
>StackOverflowError
上記から判断してイベント処理について勘違いをされている気がします。ActionListener等のハンドラー内からMouseEventなどのイベントを自分で発行したり再描画のためにpaintメソッドやpaintComponentメソッドを直接呼び出したりしていないでしょうか?
もしそうだとしたらそのような処理方法は間違いです。
何かのイベントが発生した際は表示対象(例えばブロック)の状態(表示そのものではなく表示を決める元の情報)変更して表示用コンポーネントのrepaint()メソッドを呼び出したら即座にreturnします。表示用コンポーネントでは単純にpaintComponentメソッドで表示対象の現在の状態を画面へ表示(再描画)するだけです。
具体的にはアニメーションの例が載っているページが色々あると思うのでそれらを参考にしつつもう少し簡単なものから取り組まれるとよいと思います。
この回答への補足
回答ありがとうございます。
仰る通り、だいぶ無知なためか、勘違いしている所が多々あるかもしれません。
実際、
○○Listenerに対応した操作があると、event(MousueListenerだった場合、MouseExitedなど)の関数が実行される。
しか大雑把に理解しておりませんでした。
その知識だけであとは好き勝手記述していたので、いまでは訳が分からなくなってしまいました笑。
この状況で正しい回答をいただいても、それすらちゃんと理解できないかもしれませんね。。。
もっと詳しく勉強しなおします!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TableModelListener 通知出し方
-
VB.NETでフォーム上にExcelのよ...
-
VB.NETでMSComm が追加できず?
-
delphi stringgrid
-
Visual Basic 2010を使ってRS-2...
-
Buttonの色
-
JScrollPane上のJTableの再描画
-
ファイル保存先のダイアログが...
-
同じコンポーネントを複数の場...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
private static という変数の修飾
-
他のファイルの変数参照
-
どこからも呼ばれていない無意...
-
パワーポイントのVBAでテキスト...
-
C#において、同じインスタンス...
-
オブジェクト参照がオブジェク...
-
VBAでの[]
-
Java初級 引数に適用できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
VB6のツールボックスへのコンポ...
-
VBSでCDトレイのオープン/ク...
-
Visual Basic 2010を使ってRS-2...
-
VB.NETでMSComm が追加できず?
-
[delphi] 変数を利用してコンポ...
-
JScrollPane上のJTableの再描画
-
C#で設定時刻到来時にイベント...
-
requestFocusについて
-
JButton配列でのイベント処理
-
アクティブなTextFiel...
-
ファイル保存先のダイアログが...
-
コントロールの表示・非表示
-
java gui のイベント処理が重い
-
子パネルから親パネルのコント...
-
画像を一瞬だけ表示する。
-
ウィンドウが閉じられる直前の処理
-
GUI画面でsetBounds()で作成し...
-
同じコンポーネントを複数の場...
-
SWTで動的にコントロールを追加...
おすすめ情報