0

作为我正在编写的应用程序的一部分,我在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它只是在几次计算后调用。
  • layerCenterPanelJLayeredPane坐在上面的panelLabel

正如所见,我setBounds()最后打了两次电话。最初它只被调用一次,并且它调整了 的大小palletLabel,但它没有使用刚刚在方法中设置的值,而是使用以前的值,并且托盘图像漂浮在它不应该出现的位置(作为以前的值)因为palletLabel.getHeight()正在使用)。换句话说,该方法按预期工作,但总是落后一个迭代。我通过调用setBounds()两次就解决了这个问题,它现在完全按照预期工作。我只是想知道为什么这是必要的,我尝试放入setBounds()aninvokeLater但没有效果。

欢迎任何意见,谢谢。

4

0 回答 0