0

我有一个 JPanel,上面有一些 JLabels。它们已根据 JPanel 的大小设置为特定大小。但是,当我调整 JPanel 的大小时,它们不会调整大小。我想做的是强迫他们调整大小。这是我的尝试:

public void componentResized(ComponentEvent e) {

    //just test values
    int height = 10;
    int width = 10;

    Dimension d = new Dimension(width, height);

    //whenever we detect this event, we'll resize the draft components
    for(int i = 0; i < jpPack.getComponentCount(); i++){
        jpPack.getComponent(i).setPreferredSize(d);
    }

    jpPack.revalidate();
    jpPack.repaint();

}

但是,这没有用,我没有得到任何结果。我也尝试过 setSize(d) 但也没有。我现在创建它的方式是,JLabel 的大小在创建时根据 JPanel 的大小设置。

本质上,我要做的就是告诉 JLabel“GUI 已调整大小,这是你的新大小,现在将自己重新绘制成这个大小”。我可能需要更改我的 JLabel 的绘制方法来处理这个问题吗?如果是这样,我会怎么做?

谢谢。

编辑:这里有一些额外的信息可以提供帮助。很抱歉,我无法提供一个有效的示例,但是使这项工作涉及的代码太多,而且不可行(这不是一个小项目,它是一个大项目中的一个小错误)。

ImageLabel 是我用于卡片的自定义 JLabel。除了一些存储的数据和比较方法之外,没有太多内容。下图中绘制卡片时的paintComponent方法应该只是调用super方法。

我的 JPanel 包含标签定义如下:

jpCards = new JPanel(new MigLayout("insets 0, gapx 0, gapy 0, rtl", "grow"));

当我添加图像时,它们的添加方式如下:

for(int i = 0; i < imgJLabels.length; i++){
    BufferedImage img;
    try{
        img = ImageIO.read(new URL(XML.getXML().getCardURLByName(pack[i], set)));
    }
    catch (java.net.MalformedURLException e){
    }

    int height = (jpPack.getHeight() / 2);
    if(height > 310) height = 310;
    float temp = (float)img.getWidth() / img.getHeight();
    int width = Math.round(height * temp);
    if(width > 223) width = 223;
    ImageIcon imgIcon = getScaledImage(img, height, width);
    imgJLabels[i] = new ImageLabel(img, imgIcon, pack[i]);
    jpPack.add(imgJLabels[i]);
    imgJLabels[i].addMouseListener(this);
}

我的缩放方法如下:

private ImageIcon getScaledImage(Image srcImg, int height, int width){

    BufferedImage resizedImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = resizedImg.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.drawImage(srcImg, 0, 0, width, height, null);
    g2.dispose();
    return new ImageIcon(resizedImg);
}

在这里你可以看到结果。当我将 GUI 调整为更大时,ImageLabels 的大小不会增加。当我使 GUI 变小时也是如此,卡片不会变小。

具有适当图像尺寸的默认尺寸

调整大小,图像大小相同

如您所见,我确实有卡片组的最大尺寸。但是,右侧的大卡片图像设置为相同的最大值,所以我的卡片肯定没有达到最大值。GUI 只是不调整元素的大小。

这个问题让我发疯了很长时间,我不知道该怎么办。再次感谢。

4

0 回答 0