先日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で質問しましょう!
似たような質問が見つかりました
- Windows 10 Windows11タスクバーやエクスプローラー、スタートメニュー 動画全画面時にカーソルが見えない 1 2022/04/08 00:03
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Excel(エクセル) エクセルVBA 任意のセルの選択時、指定のセルの値を表示 1 2023/04/21 08:13
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- WordPress(ワードプレス) WordpressでYouTubeの埋め込みができない。 1 2022/10/26 01:08
- Windows 10 windows11が突然起動しなくなりました 3 2022/06/30 17:49
- iOS これは日本語入力の大発明ですか? 7 2022/12/21 07:17
- Windows 10 Windows10の不具合(Critical Process Died) 9 2022/04/19 21:11
- Excel(エクセル) エクセルVBA 作業後に選択範囲を解除する方法 5 2023/02/17 07:13
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ファイル保存先のダイアログが...
-
VB.NETでMSComm が追加できず?
-
同じコンポーネントを複数の場...
-
フレーム上のコンポーネントの...
-
Visual Basic 2010を使ってRS-2...
-
requestFocusについて
-
ツールボックスのような折りたたみ
-
エクセルVBAで、条件に一致する...
-
EXCEL VBAにて動的にCheckBOXを...
-
「タイプ初期化子が例外をスロ...
-
public static void main (Stri...
-
Labelコントロールに数字を代入...
-
C# 点の描き方をおしえてくだ...
-
private static という変数の修飾
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
DataGridViewでセルクリックイ...
-
java eclipse 型に解決できません
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ファイル保存先のダイアログが...
-
requestFocusについて
-
C#で設定時刻到来時にイベント...
-
Buttonの色
-
JScrollPane上のJTableの再描画
-
VB.NETでMSComm が追加できず?
-
VB6のツールボックスへのコンポ...
-
Visual Basic 2010を使ってRS-2...
-
JButton配列でのイベント処理
-
tableView reloadDataが出来ない
-
画像を一瞬だけ表示する。
-
C++ Builder でVisibleとshow
-
VBSでCDトレイのオープン/ク...
-
フレーム上のコンポーネントの...
-
[delphi] 変数を利用してコンポ...
-
ダイアログでタイトルバーを非表示
-
文字の色の変更
-
ツールボックスのような折りたたみ
-
ゲーム画面(JFrame)のサイズ変...
おすすめ情報