2012-02-13 6 views
2

私はこの基本的なJavaアプリケーションを魔法使いdim_xdim_yで表現しています。ウィンドウとその中のキャンバスの寸法を表しています。ユーザーがウィンドウのサイズを変更するときに、これらの値を変更してキャンバスに描かれる内容が縮小/拡大されるようにするにはどうすればよいですか?このJavaアプリケーションのサイズが変更されたときにどうすればいいですか?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MLM extends Canvas { 
    static int dim_x = 720; 
    static int dim_y = 480; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Canvas canvas = new MLM(); 
     canvas.setSize(dim_x, dim_y); 
     frame.getContentPane().add(canvas); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public void paint(Graphics g) { 
     // some stuff is drawn here using dim_x and dim_y 
    } 
} 

EDIT:Binyaminの答え、次の 私が働くこれを追加しようとしましたが、それを行うには良い方法はありますか?のように、canvasを静的にしないで、多分?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MLM extends Canvas { 
    static int dim_x = 720; 
    static int dim_y = 480; 
    static Canvas canvas; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     canvas = new MLM(); 
     canvas.setSize(dim_x, dim_y); 
     frame.getContentPane().add(canvas); 

     frame.pack(); 
     frame.setVisible(true); 

     frame.addComponentListener(new ComponentListener(){ 
      public void componentResized(ComponentEvent e) { 
       Dimension d = canvas.getSize(); 
       dim_x = d.width; 
       dim_y = d.height; 
      } 
      public void componentHidden(ComponentEvent e) {} 
      public void componentMoved(ComponentEvent e) {} 
      public void componentShown(ComponentEvent e) {} 
     }); 
    } 

    public void paint(Graphics g) { 
     // some stuff is drawn here using dim_x and dim_y 
    } 
} 

答えて

6

コンポーネントリスナーを追加し、componentResizedを実装します。 Look here

frame.addComponentListener(new ComponentListener(){ 
    @Override 
    public void componentResized(ComponentEvent e) { 
     //Get size of frame and do cool stuff with it 
    } 
} 
+0

+1しかし、このメソッドは 'componentResized()'と呼ばれています – AlexR

+0

ああ、あなたもそうです、アンドロイドの慣習にもあてはまります:) – MByD

+0

これは素晴らしいです。ありがとう@ビニャミンSharet! Iv'eは残りのコードを扱うようにあなたの提案を得ましたが(上記の編集を参照)、これを行う良い方法がありますか?のように、 'canvas'を静的にしないで、おそらく? –

4
  1. は(この使用が正当な理由ではありません)正当な理由なしにAWT & Swingコンポーネントを混在させないでください。 Canvasの代わりにJComponentまたはJPanelを代わりに使用できます。
  2. リサイズを検出するためのユースケースはありません。 UIのサイズを変更した場合は、カスタムレンダリングコンポーネントのpaint()またはpaintComponent()が呼び出され、レンダリングエリアのサイズを確認するには、getWidth()/getHeight()と入力するだけです。
1

私の経験では、AWT CanvasがJPanel内にネストされている場合、キャンバスのpaint()メソッドはウィンドウが展開されているときに呼び出されますが、収縮しているときは呼び出されません。したがってキャンバスは成長することができますが、後退することはありません。サブクラス化されたCanvasをJComponentのサブクラス化でリファクタリングしました。

関連する問題