java为什么我需要调用setBounds两次才能让它工作
作为我正在编写的应用程序的一部分,我在JLabel
中调整并移动托盘的图片。因为JLabel
位于JLayeredPane
中,所以我没有使用布局管理器,因此,每当我调整palletLabel图标的大小时,我都会使用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
是panelLabel
所在的JLayeredPane
李>
如图所示,最后我调用了setBounds()
两次。最初它只被调用一次,并且它调整了palletLabel
的大小,但是它没有使用在方法前面设置的值,而是使用以前的值,托盘图像在它不应该使用的地方浮动(因为使用了palletLabel.getHeight()
的以前的值)。换句话说,该方法按预期工作,但总是落后一次迭代。我已经通过两次调用setBounds()
解决了这个问题,现在它完全按照预期工作。我只是想知道为什么这是必要的,我试着把setBounds()
放在一个invokeLater
中,但没有效果
欢迎任何意见, 谢谢
共 (0) 个答案