强制JComponent调整大小

时间:2013-08-17 21:16:48

标签: java swing user-interface resize jlabel

我有一个JPanel,上面有一些JLabel。它们已根据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的绘画方法来处理这个问题?如果是这样,我该怎么做呢?

感谢。

编辑:这是一些尝试提供帮助的其他信息。对不起,我不能提供一个有效的例子,但是有很多代码涉及到这项工作,这是不可行的(这不是一个小项目,它是大型项目中的一个小错误)。

ImageLabels是我用于我的卡片的自定义JLabel。除了一些存储数据和比较方法之外,其中没有很多。在下面的图像中绘制卡片时,paintComponent方法应该只是调用超级方法。

包含标签的我的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更小时,卡也不会变小。

Default size with appropriate image sizes

Resized larger, images same size

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

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

0 个答案:

没有答案
相关问题