我有一个 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 只是不调整元素的大小。
这个问题让我发疯了很长时间,我不知道该怎么办。再次感谢。