开发者

java resize image dynamically to fit grids in gridlayout

开发者 https://www.devze.com 2023-03-14 14:12 出处:网络
I want to make a chess type board using a custom subclass of JButton. My problem is that my images of the chess pieces are a bit too small. Is there a way I can get the image to scale to exactly the s

I want to make a chess type board using a custom subclass of JButton. My problem is that my images of the chess pieces are a bit too small. Is there a way I can get the image to scale to exactly the size of each grid in my gridlayout? If I resize the Jframe, the grids 开发者_运维技巧will change size as well. Is there a way to get the image to resize dynamically upon resizing of the whole frame?


You have 3 option for this

1) Resize the images themselves using Gimp, Photoshop, etc.

2) Create an icon dynamically

Image i = icon.getImage();
if(i != null){
   int width = (int)(size * fraction);
   int height =(int)(size*icon.getIconHeight()/icon.getIconWidth()*fraction);
   miniature = new ImageIcon(i.getScaledInstance(width, height, Image.SCALE_SMOOTH));
}

3) on the paint of your frame you can use scale

private void scaledDrawing(Graphics g, float scale){
   Graphics2D g2 = (Graphics2D) g;
   AffineTransform at = new AffineTransform();
   AffineTransform save = g2.getTransform();
   at.setToIdentity();
   at.scale(goa.getScale().x, goa.getScale().y);
   g2.transform(at);
   image.paintIcon(c, g2);
   g2.setTransform(save);
}


You could apply some transformation to the images but it might look a little ugly. If the images are small enough, maybe you can just force a minimum size of the button so that a scrollbar will appear if the frame is sized really small. Another option might be to have two or three different sets of the images at nicely scaled sizes, and swap them out for different board sizes.


Another alternative will be to override the paint function to fill all the available place:

@Override
public final void paint(final Graphics g) {
    super.paint(g);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}

Here is an example:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;


public final class Tileset extends Component {

    private Image image;

    public Tileset(final Image image) {
        this.image = image;
    }

    @Override
    public final void paint(final Graphics g) {
        super.paint(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }

    public final Image getImage() {
        return (image);
    }

    public final void setImage(final Image image) {
        this.image = image;
    }
}

With:

import javax.swing.JPanel;
import java.awt.GridLayout;


public final class Map extends JPanel {

    public Map(final GridLayout layout) {
        setLayout(layout);
    }

    public Map(final Integer width, final Integer height) {
        this(new GridLayout(width, height));
    }
}

And:

final Map map = new Map(13, 17);

final Image grass = new ImageIcon("src/main/res/tilesets/grass1.png").getImage();
final Image wood = new ImageIcon("src/main/res/tilesets/wood1.png").getImage();
final Image rock = new ImageIcon("src/main/res/tilesets/rock1.png").getImage();

for (int i = 0; i != 13; ++i) {
    for (int j = 0; j != 17; ++j) {
        if (i % 2 == 0) {
            if (j % 2 == 0)
                map.add(new Tileset(grass), i, j);
            else
                map.add(new Tileset(rock), i, j);
        }
        else
            map.add(new Tileset(wood), i, j);
    }
}

That will give you:

java resize image dynamically to fit grids in gridlayout

0

精彩评论

暂无评论...
验证码 换一张
取 消