簡體   English   中英

調整大小后,JPanel背景圖像無法填充面板

[英]JPanel background image not filling panel after resize

我正在嘗試調整背景圖像的大小,以使其始終適合其所駐留的JPanel。 程序運行時看起來很完美:

在此處輸入圖片說明

我遇到的問題是,在調整窗口大小后,它看起來像這樣:

在此處輸入圖片說明

顯然,圖像正在調整大小,但由於某些原因並未完全繪制。 這是一個更大的應用程序的一部分,但是我隔離了導致問題的最小代碼子集:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ScaleTest extends JPanel {
static JFrame window;
static JPanel mainPanel;

BufferedImage originalImage;
BufferedImage scaledImage;

ScaleTest() {
    setPreferredSize(new Dimension(320, 200));
    try {
        originalImage = ImageIO.read(new File("cat.jpg"));
    } catch(Exception e){}

    addComponentListener(new ResizerListener());
}

public void resize() {
    double widthScaleFactor = getWidth() / (double)originalImage.getWidth();
    double heightScaleFactor = getHeight() / (double)originalImage.getHeight();
    double scaleFactor = (widthScaleFactor > heightScaleFactor)? heightScaleFactor : widthScaleFactor;

    AffineTransform at = new AffineTransform();
    at.scale(scaleFactor, scaleFactor);

    AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
    scaledImage = scaleOp.filter(originalImage, scaledImage);

    repaint();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.drawImage(scaledImage, 0, 0, null);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run(){
            window = new JFrame("Scale Test");
            window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            mainPanel = new ScaleTest();
            window.getContentPane().add(mainPanel);

            window.pack();
            window.setLocationRelativeTo(null);  // positions window in center of screen
            window.setVisible(true);
        }
    });
}

class ResizerListener implements ComponentListener {
    @Override
    public void componentResized(ComponentEvent e) {
        resize();
    }

    @Override public void componentHidden(ComponentEvent e) {}
    @Override public void componentMoved(ComponentEvent e) {}
    @Override public void componentShown(ComponentEvent e) {}
}
}

如何繪制圖像並填充整個JPanel?

問題是, scaledImage的大小在后續scaledImage不會更改。

這是因為您將scaledImage的引用傳遞給filter方法,該方法將其用作結果操作的基礎,而不是生成新圖像(大小合適)

代替

scaledImage = scaleOp.filter(originalImage, scaledImage);

嘗試使用

scaledImage = scaleOp.filter(originalImage, null);

它第一次起作用的原因是因為scaledImagenull開頭

當我嘗試帶有建議更改的代碼時,我發現重新繪制有點混亂。 隨着您增加框架的大小,在繪制面板背景之前,先導邊緣上會繪制黑色背景(我在Windows 7上使用JDK7_10)。 縮小框架不會造成問題。 我認為這是由於ComponentListener和圖像的重新生成。

不需要ComponentListener。 您可以使用以下代碼即時調整圖像的大小:

super.paintComponent(g);

double widthScaleFactor = getWidth() / (double)originalImage.getWidth();
double heightScaleFactor = getHeight() / (double)originalImage.getHeight();
double scaleFactor = (widthScaleFactor > heightScaleFactor)? heightScaleFactor : widthScaleFactor;

int width = (int)(originalImage.getWidth() * scaleFactor);
int height = (int)(originalImage.getHeight() * scaleFactor);

g.drawImage(originalImage, 0, 0, width, height, null);

不知道圖像質量是否相同,因為我不知道BILINEAR會做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM