为什么需要两次调用setBounds才能使其正常工作

时间:2019-03-06 13:47:50

标签: java swing user-interface jlabel setbounds

作为我正在编写的应用程序的一部分,我调整了尺寸并在JLabel中移动了托盘的图片。由于JLabel位于JLayeredPane中,因此我没有使用布局管理器,因此,每次我调整PaletteLabel图标的大小时,我都会使用setBounds()来控制其尺寸和位置在页面上。如下图所示:

enter image description here

每次更改尺寸(由左侧的JSpinners指定)时,都会调用用于控制调整托盘图像大小时发生的情况的代码。 palletLabel的大小如下:

private void resizePalletImage(int[] size)
{
    Dimension dim = calculatePalletImageSize(size[1], size[0]);
    palletImage = ResizeImage.scaleImageByAbsoluteValues(originalPalletImage, dim);
    ImageIcon icon = new ImageIcon(palletImage);
    palletLabel.setIcon(icon);
    layerPanelHeight = layerCenterPanel.getHeight();
    //Have to set this twice, as the length hasn't "updated" by the time the first setBounds is called. Weird.
    palletLabel.setBounds(0, layerPanelHeight - palletLabel.getHeight(), icon.getIconWidth(), icon.getIconHeight());
    palletLabel.setBounds(0, layerPanelHeight - palletLabel.getHeight(), icon.getIconWidth(), icon.getIconHeight());
}
  • originalPalletImage是原始图像的高分辨率副本,用于防止在调整大量图像后出现模糊。
  • ResizeImage.scaleImageByAbsoluteValues是用于调整图像大小的静态方法。经过几次计算后,它仅调用Image.getScaledInstance
  • layerCenterPanelJLayeredPane所在的panelLabel

如图所示,我最后两次致电setBounds()。最初,它仅被调用一次,并且它调整了palletLabel的大小,但是它没有使用在方法中先前设置的值,而是使用先前的值,并且托盘图像浮动在不应该放置的位置(因为正在使用palletLabel.getHeight()的先前值)。换句话说,该方法按预期工作,但始终落后一个迭代。我已经通过两次调用setBounds()来解决了这个问题,现在它完全可以正常工作了。我只是想知道为什么这样做是必要的,所以我尝试将setBounds()放在invokeLater中,但是没有任何效果。

欢迎任何输入, 谢谢。

0 个答案:

没有答案