作为我正在编写的应用程序的一部分,我调整了尺寸并在JLabel
中移动了托盘的图片。由于JLabel
位于JLayeredPane
中,因此我没有使用布局管理器,因此,每次我调整PaletteLabel图标的大小时,我都会使用setBounds()
来控制其尺寸和位置在页面上。如下图所示:
每次更改尺寸(由左侧的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
。layerCenterPanel
是JLayeredPane
所在的panelLabel
。如图所示,我最后两次致电setBounds()
。最初,它仅被调用一次,并且它调整了palletLabel
的大小,但是它没有使用在方法中先前设置的值,而是使用先前的值,并且托盘图像浮动在不应该放置的位置(因为正在使用palletLabel.getHeight()
的先前值)。换句话说,该方法按预期工作,但始终落后一个迭代。我已经通过两次调用setBounds()
来解决了这个问题,现在它完全可以正常工作了。我只是想知道为什么这样做是必要的,所以我尝试将setBounds()
放在invokeLater
中,但是没有任何效果。
欢迎任何输入, 谢谢。