我想使用JButton的自定义子类制作国际象棋类型的棋盘。我的问题是我的棋子图像有点太小了。有没有办法让图像缩小到我的gridlayout中每个网格的大小?如果我调整Jframe的大小,网格也会改变大小。有没有办法让图像在调整整个帧的大小时动态调整大小?
答案 0 :(得分:3)
你有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);
}
答案 1 :(得分:2)
您可以对图像应用一些转换,但它可能看起来有点难看。如果图像足够小,也许您可以强制按钮的最小尺寸,以便在框架尺寸非常小时显示滚动条。另一种选择可能是在尺寸合适的尺寸下有两组或三组不同的图像,并将它们换成不同尺寸的电路板。
答案 2 :(得分:0)
另一种替代方法是覆盖绘画功能以填充所有可用位置:
@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);
}
}
这将为您提供: