イメージ拡大縮小

ブラシダイアログのサイズ変更で、ブラシイメージを連動させます。 ブラシを表示して、ダイアログのサイズをドラックで変更し、描画してください。



これを可能にするには 変更以前のパネルサイズを記憶しておきます。
そしてサイズの変更があった時に、以前のサイズとの比率でイメージサイズを変更します。
この実際は、サイズ変更ではなく、 新しいサイズのメモリイメージを作成し、 そこに現在のブラシイメージ(bufImg)を サイズ変更した描画でコピーすることで、作ります。
新しいサイズのメモリイメージのGraphics.drawImage(bufImg, 0,0,新しい幅, 新しい高さ,
        0, 0, 以前の幅, 以前の幅高さ, this);
そして、その新しいサイズのメモリイメージを現在のブラシイメージ(bufImg)に置き換えるだけで可能になります。 (単なる代入)
そこで、まずBrushDialogクラスのインスタンス変数として、次のパネルサイズ記憶用変数を用意します。
Dimension panelSize;//パネルサイズ



ウィンドウのサイズが変更された時に、イメージを変更するわけですが、 サイズ変更は、ComponentListenerインターフェースを使います。 ComponentListenerの詳細は次のリンクで調べましょう。

以下に、このインターフェイスを実装した BrushFrame.java内BrushDialogクラスのコードを示します。 以前のコードに対する変更箇所を この色で示しています。

//ブラシ用ダイアログ
class BrushDialog extends JDialog implements WindowListener, ComponentListener
{
	PaintPanel paintPanel;//作品の描画パネル
	BufferedImage bufImg;//使用するメモリイメージ
	Dimension imgSize;	//上記イメージのサイズ
	
	Dimension panelSize;//パネルサイズ

	//----インナー(内部)クラス パネル---------------------------------------
	class BrushPanel extends JPanel
	{
		public BrushPanel(Dimension size)
		{
			imgSize = size;
			this.setPreferredSize(size); //適切なサイズを設定

			//メモリーイメージを作成
			bufImg = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
		}

		//描画すべきタイミングで、呼び出されるメソッド
		public void paintComponent(Graphics g)
		{
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D)g;//これでGraphics2Dの機能も使える
			g2.drawImage(bufImg, 0, 0, this);//メモリイメージをパネルへ描画する追加
		}
	}//----インナー(内部)クラスの終端--------------------
	BrushPanel brushPanel;// 上記インナークラスを管理するインスタンス変数

	//コンストラクタ
	public BrushDialog(JFrame owner, PaintPanel  panel, Dimension size){
		super(owner);
		this.paintPanel = panel;//作品のパネルを管理
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		brushPanel = new BrushPanel(size);//内部
		this.getContentPane().add(brushPanel);
		this.pack();//サブコンポーネントの推奨サイズおよびレイアウトに合わせたサイズ変更
		this.setVisible(true);//表示する
		this.addWindowListener(this);
		
		panelSize = brushPanel.getSize(null);//初期サイズを記憶
		this.addComponentListener(this);
	}

	//メモリイメージ中央に、/4サイズの楕円を描画して、PaintPanelのブラシを指定する。
	public void drawOval(Color color){
		Graphics g = bufImg.getGraphics();
		this.setTitle(Integer.toHexString(color.getRGB()));//色の16進数値へ変換し、タイトル設定
		g.setColor(color);
		g.fillOval(0, 0, imgSize.width, imgSize.height);
		this.paintPanel.brushImg = bufImg;//PaintPanelのブラシを変更
		this.repaint();
	}

	//Window がアクティブに変化した時、呼び出されます。
	public void windowActivated(WindowEvent e){
		this.paintPanel.brushImg = bufImg;//PaintPanelのブラシを変更
	}
	//dispose の呼び出し結果で、ウィンドウクローズ処理終了時に呼び出されます。
	public void windowClosed(WindowEvent e){
	}
	//ユーザによる閉じるボタン操作などで、閉じる処理直前に呼び出されます。
	public void windowClosing(WindowEvent e){
	}
	//Window がアクティブでなくなったときに呼び出されます。
	public void windowDeactivated(WindowEvent e){
	}
	//最小化状態から通常の状態に変更された時、呼び出されます。
	public void windowDeiconified(WindowEvent e){
	}
	//通常の状態から最小化された状態に変更された時、呼び出されます。
	public void windowIconified(WindowEvent e){
	}
	//ウィンドウが最初に可視になった時、呼び出されます。
	public void windowOpened(WindowEvent e){
	}
	
		
	//コンポーネントが不可視になる時に呼び出される
	public void componentHidden(ComponentEvent e){
	}
	//コンポーネントの位置が変わる時に呼び出される	
	public void componentMoved(ComponentEvent e){
	}
	//コンポーネントのサイズが変わる時に呼び出される	
	public void componentResized(ComponentEvent e){

		Dimension previousSize = panelSize;//以前のパネルサイズ
		panelSize = brushPanel.getSize(null);//変更後サイズを記憶
	
		int type = bufImg.getType();
		int w = imgSize.width * panelSize.width / previousSize.width;
		int h = imgSize.height * panelSize.height / previousSize.height;
		//新しいイメージバッファの生成
		BufferedImage tmpImg = new BufferedImage(w, h, type);
		
		Graphics tmpG = tmpImg.getGraphics();
		tmpG.drawImage(bufImg, 0, 0, w, h,
			0, 0, imgSize.width, imgSize.height, this);//新しいサイズに合わせてサイズ変更コピー
		bufImg = tmpImg;//上記で作成した新しいバッファへ変更

		System.out.println(imgSize.width + "⇒" + w + "   ,  " + imgSize.height + "⇒" + h);
		imgSize.setSize(new Dimension(w, h));
		paintPanel.brushImg = bufImg;//PaintPanelのブラシを変更
	}
	//コンポーネントが可視になる時に呼び出される
	public void componentShown(ComponentEvent e){
	}
}

上記を確認後、このボタンをクリックください。→