Java GUIのイベント処理が重い

このQ&Aのポイント
  • Javaのマウスイベントやキーイベントを同時に実行すると重くなる問題が発生しています。
  • ボタンを選択してブロックを表示し、マウスの位置に合わせてボード上に移動させる処理はできましたが、上左右キーを押すと重くなってしまいます。
  • また、ボード上にカーソルを移動するとStackOverflowErrorが発生してしまいます。解決方法について教えてください。
回答を見る
  • ベストアンサー

java gui のイベント処理が重い

先日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の使い方しか勉強していないので、さっぱりでございます。 たぶんこのエラーも重くなっている原因の一つだとおもっていますが、、、、、、、、 詳しい方、エラー含め、解決方法、改善方法等、教えていただけませんでしょうか?? 情報不足だった場合、必要な物を教えていただければ、わかる範囲で追記します。 ヒントでも推測でもいいです。ここまで来て挫けたくないです><。 助けてください~><。

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • KSOH
  • ベストアンサー率93% (29/31)
回答No.1

>javaのマウスイベントやキーイベントを同時にやろうとすると... >2.そのActionEventの中でMouseListenerを使ってMouseEnteredとMouseExitedを実行して、カーソルの位置の移動に合わせて、ボード上に選んだブロックを表示して >StackOverflowError 上記から判断してイベント処理について勘違いをされている気がします。ActionListener等のハンドラー内からMouseEventなどのイベントを自分で発行したり再描画のためにpaintメソッドやpaintComponentメソッドを直接呼び出したりしていないでしょうか? もしそうだとしたらそのような処理方法は間違いです。 何かのイベントが発生した際は表示対象(例えばブロック)の状態(表示そのものではなく表示を決める元の情報)変更して表示用コンポーネントのrepaint()メソッドを呼び出したら即座にreturnします。表示用コンポーネントでは単純にpaintComponentメソッドで表示対象の現在の状態を画面へ表示(再描画)するだけです。 具体的にはアニメーションの例が載っているページが色々あると思うのでそれらを参考にしつつもう少し簡単なものから取り組まれるとよいと思います。

igo404
質問者

補足

回答ありがとうございます。 仰る通り、だいぶ無知なためか、勘違いしている所が多々あるかもしれません。 実際、 ○○Listenerに対応した操作があると、event(MousueListenerだった場合、MouseExitedなど)の関数が実行される。 しか大雑把に理解しておりませんでした。 その知識だけであとは好き勝手記述していたので、いまでは訳が分からなくなってしまいました笑。 この状況で正しい回答をいただいても、それすらちゃんと理解できないかもしれませんね。。。 もっと詳しく勉強しなおします! ありがとうございました。

関連するQ&A

  • javaのGUIツールキット

    javaのGUIツールキット * AWT(Abstract Window Toolkit) * Swing 上記の2種を用いる課題が出ているのですが、java.awtとjavax.swingの2つが必要とのことなので、ubuntu Linux上のSynapticパッケージマネージャにて検索をかけ、libcharva1-javaというパッケージをインストールしました。 その後 import java.awt.*; class TestFrame { public static void main(String argv[]) { Frame f = new Frame("Test"); f.setSize(300,200); f.setVisible(true); } } などのプログラムをコンパイルしてみたところ、 Exception in thread "main" java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it. at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source) at java.awt.Window.<init>(Unknown Source) at java.awt.Frame.<init>(Unknown Source) at javax.swing.JFrame.<init>(Unknown Source) at TestFrame.main(rensyuu1.java:6) とエラーが示されてしまいます。 これはどのように解決すればよいのでしょうか。 環境は以下のとおりです。 使用OS:WindowsVista vmwareにてubuntu-Linux8.1をエミュレート JDK6もインストール済みなのですがどうにもうまくいきません。 どうか解答よろしくお願い致します。

  • setAutoCommit(false)で例外発生してしまいます

    はじめまして。fswmiyajimaと申します。 現在JavaでDBを使用した簡単なスタンドアロンアプリケーションを作成しています。 DBにはMicrosoft Access(ojdbc14 + Microsoft Access Driver 4.00.6305.00)を利用しています。 開発環境では問題無くテストまで終わっていたのですが、 別のPCに持っていった時、例外が発生していまいました(末尾に記載)。 問題は、トランザクション開始時(setAutoCommit(false))に発生します。 尚、DBとなるmdbファイルはNASに存在し、そのファイルを見るように各PCのODBCマネージャーで設定しています。 少し調べを入れてみましたが、プロバイダがトランザクションをサポートしていないのが原因である、という記述を見つけました。 しかし、開発環境では問題なく動作しているので、どこに原因があるのか突き止められず、困っています。 どうかご教示いただければと思います。よろしくお願いします。 例外全文 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]属性を設定できません。 at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) at sun.jdbc.odbc.JdbcOdbc.SQLSetConnectOption(Unknown Source) at sun.jdbc.odbc.JdbcOdbcConnection.setAutoCommit(Unknown Source) at dbcommon.MSAccessCon.transactionBegin(MSAccessCon.java:30) at view.Main.exec(Main.java:315) at view.Main.access$0(Main.java:309) at view.Main$1.actionPerformed(Main.java:112) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) ※Main.java:315: con.setAutoCommit(false); ※このconはConnectionオブジェクトで、このコネクションを用いてのselect句の発行はどの環境でも正常に行えています。

    • ベストアンサー
    • Java
  • Eclipse以外でアプレットが実行出来無い

    おはよう御座います、非常に初歩的な内容だと思うのですが、アプレットについて質問させて頂きます。 現在、Eclipseで作成したアプレットを、ブラウザ上で実行しようとしています。 ですが、Eclipseでアプレットを起動中に自動生成されるhtmlファイルをコピーしたhtmlファイルでも、アプレットを起動することが出来ないのです。 htmlファイルとclassファイルの内容さえ同じであれば、起動出来るのではと思っていたのですが・・・、何処がEclipseとChromeで違い、どう直せば良いのか解らず、質問させて頂きました。 HTMLファイルの内容は <html> <body> <applet code=Practice_1/HelloWorld.class width="200" height="200" > </applet> </body> </html> エラーの内容は以下の通りです。 Java Plug-in 1.6.0_31 使用中の JRE のバージョン 1.6.0_31-b05 Java HotSpot(TM) Client VM ユーザのホームディレクトリ = C:\Users\名前 java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$000(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.awt.EventQueue$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.jbox2d.callbacks.ContactListener at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 20 more 例外: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/jbox2d/callbacks/ContactListener 実行しようとしているプログラムでは、Eclipseで言う所のプロジェクト内に、ImageとPractice_1というパッケージがあり、動作させたいクラスはPractice_1内に入っています、Eclipseでは当然何のエラーも無く実行出来ます。 見た限り、ContactListenerクラスが見つからない、というエラーのようなのですが、それ以外の後から入れたライブラリのクラスに関してはエラーが表示されていないので困惑しています。 Eclipseで自動生成された内容から一切変えていないので、htmlファイルが間違っているわけでは無いと思っていたのですが、ブラウザ上で起動する場合は何か付け加える物があるのでしょうか・・・、どなたか解る方が居ましたら、解答頂けると助かります。

    • ベストアンサー
    • Java
  • コマンドプロンプトのエラーについて

    コマンドプロンプトを実行すると以下のようなエラー文が出ました。 Exception in thread "main" java.lang.IllegalArgumentException: cannot add to lay out: unknown constraint: Canter at java.awt.BorderLayout.addLayoutComponent(Unknown Source) at java.awt.BorderLayout.addLayoutComponent(Unknown Source) at javax.swing.JRootPane$1.addLayoutComponent(Unknown Source) at java.awt.Container.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at calendar.<init>(calendar.java:49) at calendar.main(calendar.java:78) 本などで、自分なりに調べたのですが解決できずに困っています。 原因が分かる方、いらっしゃいましたらご回答いただけますか?

  • マウスのイベント処理について

    「/home/tatuya/MyDocument/logo.jpg」の画像をドラック・移動できるようにしたいのですがうまくいきません。 なにがいけないのか教えてください。 できれば手直しして動くようになったプログラムをはってもらえるとさいわいです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.ImageIO; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.Graphics; import java.awt.Image; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class bb extends JFrame{ private int px; private int py; boolean flag=false; Image icon=getToolkit().getImage("/home/tatuya/MyDocument/logo.jpg"); public static void main(String[] args){ bb frame = new bb(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 400, 250); frame.setTitle("タイトル"); frame.setVisible(true); new bb(); } public void paint(Graphics g){ g.drawImage(icon,px,py,this); } public void mouseClicked(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseEntered(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseExited(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mousePressed(MouseEvent e){ /* 処理したい内容をここに記述する */ if (px<=e.getX() && e.getX()<=px+221 && py<=e.getY() && e.getY()<=py+59) flag=true; repaint(); } public void mouseReleased(MouseEvent e){ /* 処理したい内容をここに記述する */ flag=false; } public void mouseDragged(MouseEvent e){ if (flag){ px=e.getX();py=e.getY(); repaint(); } } public void mouseMoved(MouseEvent e){ } }

  • Javaアプレットからウェブサーバ上のEXEを実行できる?

    JavaアプレットからRuntime.exec()を使って同ディレクトリ内のEXEを呼び出し、 EXEが出力したファイルをアプレットで読み込む、 というのをウェブサーバ上で(というかウェブブラウザから)やりたいのですが、 それはできるのでしょうか。 試しにブラウザから実行してみたところ、コンソールに以下のエラーが出力され失敗しました。 Exception in thread "AWT-EventQueue-4" java.security.AccessControlException: access denied (java.io.FilePermission <<ALL FILES>> execute)     at java.security.AccessControlContext.checkPermission(Unknown Source)     at java.security.AccessController.checkPermission(Unknown Source)     at java.lang.SecurityManager.checkPermission(Unknown Source)     at java.lang.SecurityManager.checkExec(Unknown Source)     at java.lang.ProcessBuilder.start(Unknown Source)     at java.lang.Runtime.exec(Unknown Source)     at java.lang.Runtime.exec(Unknown Source)     at java.lang.Runtime.exec(Unknown Source)     以下略 サーバ環境は以下です。 Windows 7 64bit pro XAMPP for windows ver 1.7.2 Apacheの設定次第でできるのでしょうか。

    • ベストアンサー
    • Java
  • javaでopenglプログラムが実行できません

    お世話になります。 javaでopenglのプログラムを実行すべくjava.netのJOGLプロジェクトのページから以下をダウンロードしました。 jogl-1.1.1a-windows-i586.zip jogl-demos.zip jogl-demos-src.zip 参考サイトの指示に従って、jogl.jarを含む全ての*.jarを[JDK_HOME]\jre\lib\extにコピーし、gluegen-rt.dll,jogl.dll,jogl_awt.dll,jogl_cg.dllを[JDK_HOME]\jre\binにコピーしてインストールしましたが 以下のようにデモプログラムを実行すると以下のエラーが出て実行できません。 どこが悪いのでしょうか?よろしくお願いします。 F:\java\opengl\jogl-demos>java -cp jogl-demos.jar demos.gears.Gears Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/opengl/GLEventListener at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Caused by: java.lang.ClassNotFoundException: javax.media.opengl.GLEventListener at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) ... 12 more Could not find the main class: demos.gears.Gears. Program will exit. 参考サイト http://itpro.nikkeibp.co.jp/article/COLUMN/20060710/242865/?ST=develop

  • java.lang.NoClassDefFoundError。。。

    どうぞ知恵をお貸しください。 ・jdk-1.5.0.16 ・mysql-4.0.26-win32 ・mysql-connector-java-3.1.14 ・eclipse 3.2.0 をダウンロード、インストールしてjavaの勉強を行っています。 コマンドプロンプトよりコンパイルを成功した場合は実行時に下記のエラーが、 Exception in thread "main" java.lang.NoClassDefFoundError コンパイルに失敗した場合は「読み込めません」のエラーが出力されます。 環境変数でCLASSPATHも設定してありますが、あえて実行時にclasspathを指定しても試みてみましたがエラーは変わりません。 何が原因なのでしょうか? どうぞご指導をよろしくお願いします。 エラー全文 Exception in thread "main" java.lang.NoClassDefFoundError: sample (wrong name: mypackage/sample) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source)

  • Javaでのエラーについて

    Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '.' at java.util.Formatter.checkText(Unknown Source) at java.util.Formatter.parse(Unknown Source) at java.util.Formatter.format(Unknown Source) at java.io.PrintStream.format(Unknown Source) at java.io.PrintStream.printf(Unknown Source) at ShininginSpace.main(ShininginSpace.java:33) と出てきたのですが、これはどういう意味ですか?

    • ベストアンサー
    • Java
  • java アプレットでエラー

    以下のサンプルソースをEclipse上で実行したら "アプレットは初期化されていません"というエラーになってしまいました。 //フレームウィンドウの表示/非表示を切り替える。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Sample129 extends Applet implements ActionListener { Button bt; frame fr; public void init() { bt = new Button("ウィンドウ表示"); add(bt); bt.addActionListener(this); fr = new frame("操作対象ウィンドウ"); fr.setSize(250,120); } public void actionPerformed(ActionEvent event) { //ウインドウを表示 fr.setVisible(true); } } class frame extends Frame { frame(String title) { super(title); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //ウインドウを非表示 setVisible(false); } }); } public void paint(Graphics g) { g.drawString("閉じるボタンで非表示",65,65); } } ■エラー内容 java.lang.NoSuchMethodError: frame: method <init>(Ljava/lang/String;)V not found at Sample129.init(Sample129.java:17) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) どうすればこのエラーが解消できるのでしょうか。

専門家に質問してみよう