Search code examples
swinggraphics2djava

Resize drawing to match frame size


I've written an app that custom draws everything inside paint() based on fixed pixel positions. Then I disabled resize of the frame so its always visible.

However, now I would like to be able to resize it but I dont want to change my drawling code. I was hoping I could grab the 300x300 square of the Graphics g object and resize it to the JFrame current size after all of my drawling code, but I have no idea what I'm doing.

Here sample code. In this I want the 100x100 square to remain in the middle, proportionate to the resized JFrame:

package DrawAndScale;

import java.awt.Color;
import java.awt.Graphics;

public class DASFrame extends javax.swing.JFrame {
    public DASFrame() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        this.setSize(300, 300);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DASFrame().setVisible(true);
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fill3DRect(100, 100, 100, 100, true);
    }
}

Thanks.


Solution

  • Assuming you rename your method that paints for 300x300 as paint300, define a buffered image:

    @Override public void paint(Graphics g) {
         Image bufferImage = createImage(300, 300);  // empty image
         paint300(bufferImage.getGraphics());  // fill the image
         g.drawImage(bufferImage, 0, 0, null);  // send the image to graphics device
    }
    

    Above is when you want to draw at full size (300x300). If your window is resized:

    @Override public void paint(Graphics g) {
         Image bufferImage = createImage(300, 300);  
         paint300(bufferImage.getGraphics());
         int width = getWidth();
         int height = getHeight(); 
         CropImageFilter crop = 
             new CropImageFilter((300 - width)/2, (300 - height)/2 , width, height);
         FilteredImageSource fis = new FilteredImageSource(bufferImage, crop);
         Image croppedImage = createImage(fis);
         g.drawImage(croppedImage, 0, 0, null);
    }
    

    The new classes are from from java.awt.image.*.

    I didn't test this code. It's just to send you in the right direction.