我有一个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更小时,卡也不会变小。
正如您所见,我确实拥有卡片组的最大尺寸。但是,右侧的大卡片图像设置为相同的最大值,因此我的卡片绝对不会达到最大值。 GUI只是没有调整元素的大小。
这个问题让我疯了很长时间,我不知道该怎么做。再次感谢。