作为我正在编写的应用程序的一部分,我在JLabel
. 因为JLabel
在 a 中JLayeredPane
,所以我没有使用布局管理器,因此,每次我调整托盘标签的图标大小时,我都会使用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()
aninvokeLater
但没有效果。
欢迎任何意见,谢谢。