在红色位置,我想放置一个缩放的图像,以便填充所有可用空间。此外,我可以选择使用不同比例的真实图像显示图像(20%,50%,100%......)。
我正在尝试找到使图像完美匹配的比例因子:
//GET VALUES
int imageWidth = image1.getWidth();
int imageHeight = image1.getHeight();
System.out.println("Image: "+imageWidth + " "+ imageHeight);
int targetWidth = this.getBounds().width;
int targetHeight = this.getBounds().height;
System.out.println("Target: " + targetWidth + " "+ targetHeight);
//GET SCALE
float scaleWidth=1;
float scaleHeight=1;
if (imageWidth > targetWidth) {
scaleWidth = (float) targetWidth / (float) imageWidth;
}
if (imageHeight > targetHeight) {
scaleHeight = (float) targetHeight / (float) imageHeight;
}
return min(scaleWidth, scaleHeight);
问题是我找不到可用空间的大小(For BorderLayout.CENTER)。我在代码中写了窗口大小,但这是不正确的,我也尝试过:
this.getLayout().preferredLayoutSize(this).width;
但它也给出了一个不正确的值,或者至少不是我想要找到的值。而且我找不到任何与尺寸相关的其他方法。并且试图从面板中获取值将是不可行的,因为我在创建它之前需要该值。
有人能告诉我怎么才能找到这个价值? 谢谢。
答案 0 :(得分:1)
你不应该试图获得可用的尺寸。
如果您真的想知道这个值,那么您应该进行自定义绘制并动态调整图像大小并使用paintComponent()
方法绘制图像。
所以基本代码就像:
public class ImagePanel extend JPanel
{
public ImagePane(...)
{
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
// do your scaling
g.drawImage(...);
}
}
或者,如果您不想进行动态扩展,则可以向面板添加ComponentListener
并处理componentResized
事件。然后,您可以获得面板的实际大小并进行缩放计算。阅读How to Write a Component Listener上Swing教程中的部分,了解更多信息和示例。
最后,您还可以使用Darryl的Stretch Icon,它会根据可用空间自动缩放图标。您需要做的就是使用JLabel
创建StretchIcon
并将其添加到您的GUI中。