ブラシダイアログのサイズ変更で、ブラシイメージを連動させます。
ブラシを表示して、ダイアログのサイズをドラックで変更し、描画してください。
これを可能にするには
変更以前のパネルサイズを記憶しておきます。
そしてサイズの変更があった時に、以前のサイズとの比率でイメージサイズを変更します。
この実際は、サイズ変更ではなく、
新しいサイズのメモリイメージを作成し、
そこに現在のブラシイメージ(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){ } }
上記を確認後、このボタンをクリックください。→