0

私はいくつかの 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 は要素のサイズを変更していません。

この問題は私を長い間悩ませてきました。どうしたらいいのかわかりません。再度、感謝します。

4

0 に答える 0