↓発生する例外 Exception occurred during event dispatching: java.lang.NullPointerException at javax.swing.text.html.FormView.submitData(FormView.java:376) at javax.swing.text.html.FormView.actionPerformed(FormView.java:356) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) ・・・・ 0087デフォルトの名無しさん2012/01/24(火) 01:22:12.63 ポップアップメニューで選択されたのをトリガーとして なにか重い処理を行う場合(サンプルコードのdoSomethingメソッドのような)、 ポップアップメニューが表示されたまま、画面が固まったようになってしまいます。 画面が固まるのは仕方ないとして、別処理の前にポップアップメニューを 非表示にすることはできないのでしょうか。よろしくお願いします。
http://toro.2ch.net/test/read.cgi/tech/1329715551/388-389 ★★Java質問・相談スレッド152★★ 0111942012/03/06(火) 14:09:03.26>>102 さまはじめみなさま どうもありがとうございました。やりたかったのは次のようなことでした。 public class FrameA extends JFrame { final JFrame frameA = this; //これで期待通り動いた[PPP] JMenuItem menuItemForB = new JMenuItem(); menuItemForB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { panelB = new PanelB(frameA); //[QQQ] } } ); } public class PanelB extends JPanel { public PanelB(FrameA frameA) //frameAの参照を引数で渡す[RRR] { //ここから frameA を操作するために frameA を参照する } } [PPP] のように単純に FrameA の this を取って [QQQ] [RRR] のように引数で渡したところ期待通り PanelB の内部から frameA を参照して操作できるようになりました。動かなかった原因は [PPP] の this のかわりに>>96に書いたaRootを使っていたことでした。これでOKですが、もし [RRR]のように 引数で親の参照を渡すのより良い方法がSwingプログラムの常套手段にあるようならお教えください。 0112デフォルトの名無しさん2012/03/06(火) 14:26:22.68 ない 0113デフォルトの名無しさん2012/03/06(火) 15:56:14.06 PanelBが内部クラスならできるよ
public class FrameA extends JFrame { JMenuItem menuItemForB = new JMenuItem(); public FrameA(){ menuItemForB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { panelB = new PanelB(){ } } ); }
public class PanelB extends JPanel { public PanelB() //frameAの参照を引数で渡す[RRR] { //FrameA.thisで呼ぶ } } } 0114942012/03/06(火) 16:20:38.22>>113 なるほど FrameA の中で PanelB を定義すれば FrameA.this が見えるわけですね。 なお >>111に示したコードの前半もほんとうは>>113のように FrameA の コンストラクタ内にあったんですが貼り付けるときに削除してしまっていました。 Swing も内部クラスも使ったことがなかったので勉強になります。ただ、PanelB の コードは FrameA から独立させて書いておきたいので、Swing のマナー違反でない 限り >>111のような引数渡しの方法を使おうと思っています。どうもありがとうございました。 0115デフォルトの名無しさん2012/03/06(火) 17:03:13.13 単に public class FrameA extends JFrame { JMenuItem menuItemForB = new JMenuItem(); menuItemForB.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { panelB = new PanelB(FrameA.this); } } ); } は? 0116942012/03/06(火) 17:45:57.39>>115 いちいちframeAに代入したりしないで直接FrameA.thisを渡すということですね。 >>111 よりスマートだしいけそうですね。どうもありがとうございます。 0117営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 17:18:43.81 JFrame をマウスでドラッグして移動するイベントを取得するにはどのようにするのが 定石なんでしょうか?以下のような構造のコードを書いてみましたが、タイトルバーの下の 本体領域の内部では[A][B]の処理が行われるものの、本来の目的である JFrame 全体の ドラッグは検知しないようです。HierarchyBoundsListener() を使えば JFrame 移動の イベントを取得できましたが、マウスのドラッグ以外による移動まで検知してしまうので できれば使いたくありません。簡単な方法がありましたらお教えいただきたくお願いします。 public class Test extends JFrame implements MouseMotionListener { public Test() { ... addMouseMotionListener(this); } public void mouseDragged(MouseEvent e) { ... } //[A] public void mouseMoved(MouseEvent e) { ... } //[B] } 0118営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 18:51:29.84>>117 で質問したものです。挙動がおかしかったのはマルチディスプレイ・ マルチワークスペースという少し特殊な環境でテストしていたからのようで、 普通の単一スクリーン上でテストしたところ期待通り動いていました。 現在 HyerarchyBoundsListenerを使っていますが、ComponentListener の componentMoved() でも良さそうです。マルチ・ワークスペースに対応する ように修正することにします。うまくいかなかったらまた質問させてください。 0119営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 16:01:05.53http://orablogs-jp.blogspot.jp/2012/02/mpeg-4-multimedia-support-in-javafx.html