首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java动态调整图像大小以适应网格布局中的网格

java动态调整图像大小以适应网格布局中的网格
EN

Stack Overflow用户
提问于 2011-06-23 01:30:42
回答 3查看 4.3K关注 0票数 1

我想用JButton的一个自定义子类做一个国际象棋棋盘。我的问题是我的棋子图像太小了一点。有没有办法让图像缩放到我的网格布局中每个网格的大小?如果我调整Jframe的大小,网格也会改变大小。有没有办法让图像在调整整个帧的大小时动态调整大小?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-23 01:37:55

你有3种选择

1)使用Gimp、Photoshop等调整图像本身的大小。

2)动态创建图标

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)在你的画框上,你可以使用比例

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);
}
票数 3
EN

Stack Overflow用户

发布于 2011-06-23 01:37:21

您可以对图像应用一些转换,但它可能看起来有点丑陋。如果图像足够小,也许你可以强制设置按钮的最小尺寸,这样如果框架的尺寸非常小,就会出现滚动条。另一种选择可能是有两到三组不同的图像,大小调整得很好,然后用不同的板大小交换它们。

票数 2
EN

Stack Overflow用户

发布于 2018-07-28 04:34:50

另一种替代方法是覆盖paint函数以填充所有可用位置:

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

下面是一个示例:

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;
    }
}

通过以下方式:

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));
    }
}

和:

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);
    }
}

这将为您提供:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6444042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档