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

java动态调整图像大小以适应gridlayout中的网格,java,image,swing,resize,jbutton,Java,Image,Swing,Resize,Jbutton,我想使用JButton的自定义子类制作一个国际象棋类型的棋盘。我的问题是,我的象棋图像有点太小了。是否有一种方法可以使图像精确缩放到gridlayout中每个网格的大小?如果我调整Jframe的大小,网格的大小也会改变。有没有一种方法可以使图像在调整整个帧的大小时动态调整大小?您可以对图像应用一些变换,但它可能看起来有点难看。如果图像足够小,您可以强制设置按钮的最小大小,以便在帧非常小时显示滚动条。另一种选择可能是使用两组或三组不同的图像,它们的大小可以很好地缩放,然后将它们换成不同的电路板大小

我想使用JButton的自定义子类制作一个国际象棋类型的棋盘。我的问题是,我的象棋图像有点太小了。是否有一种方法可以使图像精确缩放到gridlayout中每个网格的大小?如果我调整Jframe的大小,网格的大小也会改变。有没有一种方法可以使图像在调整整个帧的大小时动态调整大小?

您可以对图像应用一些变换,但它可能看起来有点难看。如果图像足够小,您可以强制设置按钮的最小大小,以便在帧非常小时显示滚动条。另一种选择可能是使用两组或三组不同的图像,它们的大小可以很好地缩放,然后将它们换成不同的电路板大小。

您可以对图像进行一些变换,但看起来可能有点难看。如果图像足够小,您可以强制设置按钮的最小大小,以便在帧非常小时显示滚动条。另一种选择可能是有两个或三个不同的图像集,具有良好的缩放尺寸,并将它们交换为不同的电路板尺寸

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个选择

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

另一种选择是覆盖绘制功能以填充所有可用位置:

@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;
    }
}
与:

以及:

这将给你:


另一种选择是覆盖绘制功能以填充所有可用位置:

@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;
    }
}
与:

以及:

这将给你:


在你的选择2中。分数是什么?这只是我指定的一个变量吗?是否有办法确定网格的初始大小,以便我可以至少在初始阶段应用方法2?谢天谢地,这只是一个因素,一个计算之前,保持一个特定的比率。在您的面板中,您可以始终执行getHeight getWidth来计算所需图像的大小;对不起,也许我只是在装傻。我使用的是gridlayout3,3,我不知道如何获得特定网格的大小。我想也许我可以得到面板的大小并进行分割来计算,但是在我的JPanel上调用getHeight返回0,这对我来说毫无意义。分数是什么?这只是我指定的一个变量吗?是否有办法确定网格的初始大小,以便我可以至少在初始阶段应用方法2?谢天谢地,这只是一个因素,一个计算之前,保持一个特定的比率。在您的面板中,您可以始终执行getHeight getWidth来计算所需图像的大小;对不起,也许我只是在装傻。我使用的是gridlayout3,3,我不知道如何获得特定网格的大小。我想也许我可以得到面板的大小并进行分割来计算,但是在我的JPanel上调用getHeight返回0,这对我来说毫无意义。