如何在布局中获得可用空间?

时间:2016-11-03 13:56:41

标签: java swing layout scaling space

我有这个发行版的borderLayout: enter image description here

在红色位置,我想放置一个缩放的图像,以便填充所有可用空间。此外,我可以选择使用不同比例的真实图像显示图像(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; 

但它也给出了一个不正确的值,或者至少不是我想要找到的值。而且我找不到任何与尺寸相关的其他方法。并且试图从面板中获取值将是不可行的,因为我在创建它之前需要该值。

有人能告诉我怎么才能找到这个价值? 谢谢。

1 个答案:

答案 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中。