私はいくつかの JLabel を持つ JPanel を持っています。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 の paint メソッドを変更する必要があるでしょうか? もしそうなら、どうすればいいですか?
ありがとう。
編集: ここに役立ついくつかの追加情報があります。実際の例を提供できなくて申し訳ありませんが、これを機能させるには非常に多くのコードが必要であり、実現可能ではありません (これは小さなプロジェクトではなく、大きなプロジェクトの小さなバグです)。
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 は要素のサイズを変更していません。
この問題は私を長い間悩ませてきました。どうしたらいいのかわかりません。再度、感謝します。