有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我需要调用setBounds两次才能让它工作

作为我正在编写的应用程序的一部分,我在JLabel中调整并移动托盘的图片。因为JLabel位于JLayeredPane中,所以我没有使用布局管理器,因此,每当我调整palletLabel图标的大小时,我都会使用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
  • layerCenterPanelpanelLabel所在的JLayeredPane

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

欢迎任何意见, 谢谢


共 (0) 个答案