2011-12-28 7 views
4

ユーザーがマウスをドラッグしてフレームのサイズを変更すると、JFrameの高さと幅を知りたいという状況が発生しました。 Listen to JFrame resize events as the user drags their mouse?JFrameの高さと幅のリアルタイムリッスン

私の問題がある:私は私の「HSFrame」クラスはActionListenerをJFrameのを拡張して実装してきたすべての方法を

は、私はこれを調査し、次の質問に設けた答えは私のほんの少しの助けではなく、 、MouseMotionListener(ActionListenerはこの質問とは無関係です)。この質問に関係するのはMouseMotionListenerです。

私は、JPanelを拡張する "CanvasPanel"という別のクラスを持っています。これは、グラフィックスオブジェクトを使用して、描画文字列によってリアルタイム情報を更新する場所です。

public void mouseMoved(MouseEvent e) 
{ 
} 

public void mouseDragged(MouseEvent e) 
{ 
    validate(); 
    canvas.repaint(); 
} 

これが私の "HSFrame" クラス(のMouseMotionListenerを実装し、JFrameのを拡張)からのコードの抜粋です。このコード例では、「canvas」はCanvasPanelオブジェクトであり、MouseDraggedが呼び出されるたびにそのrepaint()メソッドを呼び出しています。

これは、(おそらく)ComponentListenerのcomponentResized()メソッド(これはMouseReleasedに関連付けられている)とは対照的にリアルタイムの更新を提供するため、MouseMotionListenerを使用することを選択しました。

左上隅からフレームのサイズを変更すると、すべてが100%完全に更新されます。高さ、幅、X、Yの値はすべて完全に再ペイントされます。

ただし、右下隅からサイズを変更すると、リアルタイムで更新されません。そして私はあなたについて知りませんが、私は物事を右下からサイズ変更することを好みます。

"CanvasPanel"クラス自体では、ComponentListenerを拡張してそこの "HSFrame"オブジェクトにリスナーを追加しました。リアルタイムでは更新されませんでしたが、後で高さと幅を再描画しますHSFrameのサイズを変更したコーナーに関係なく、マウスが解放されます。

メイン質問: MouseMostionListenerを取得して、右下からJFrameのサイズを変更していることを知ることはできますか?タイトルバーをクリックしてドラッグしてフレームを移動すると、左上隅からサイズを変更すると聞こえます(タイトルバーとやりとりしています)。何かがJFrameの他の境界に向かうときは、それは聞こえません。

+0

Mmmmはプロパティ変更イベントを発生させませんか? –

+6

bottom/rightからサイズを変更すると、componentResized()イベントが動的に起動します。私はXPでJDK6_7を使用しています。問題を示す[SSCCE](http://www.sscce.org)を投稿してください。 – camickr

+0

[SSCCE](http://pastebin.com/Q0nbQcpm) ここでは基本的な例を示します。 MainClass.javaとして保存し、コンパイルして実行します。 1つのJAVAファイルと同じように動作するはずです。 ここでの問題は次のとおりです。メインアプリケーションウィンドウのサイズ変更は、ユーザーが右下からドラッグするとリアルタイムで再描画されません。左上からドラッグしてリアルタイムに塗り直します。 これは私の考えです。どこからでもデバッグウィンドウをドラッグすると、リアルタイムで更新されます。 なぜ、メインウィンドウでそれをしないのですか?両方のリスナを両方のフレームに追加しました。 ボトム・ライトは動作しないものです。 – Waffle

答えて

3

マウスでこれを行う必要はありません。簡単なやり方: component listenerを書きます。 HSFrameにComponentListenerを実装し、サイズ変更コードをpublic void componentResized(ComponentEvent e)に入れてください。

右下からドラッグすると、マウスがJFrameにないので、イベントリスナーがそれを受け取らないため、mouseListenerは機能しません。

+0

ありがとう、私は確かにこれを試してみました。ここでは、私が話していることを示す[SSCCE](http://pastebin.com/Q0nbQcpm)があります(生のコードをMainClass.javaとして保存し、コンパイルしてから実行してください)。リアルタイムで更新されないのは、右下から "ResizeFrame"(例のHSFrameに相当)のサイズを変更することだけです。私はちょうどそれを取得しません - 右下の作品からデバッグフレームのサイズを変更します。 ComponentListenerとMouseMotionListenerの両方を両方のフレームに追加しましたが、ResizeFrameの右下はマウスがドラッグされると再描画されません。 – Waffle

+0

申し訳ありませんが、その例の小さな修正があります:[SSCCE](http://pastebin.com/NMWvxj6Y)。私はresizeFrameクラスのComponentListenerメソッドにcanvas.repaint()を追加することを忘れていました。以前はrepaint()を呼び出していました。 – Waffle

+0

Hmmmmm ....それは変だ。 – eboix