首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 實作可隨視窗縮放的背景圖片面板

     編輯:Java 相關知識

核心思路

繼承 JPanel,覆寫 paintComponent 繪製背景圖,並將此面板置於容器最底層(z-index = -1),使其成為真正的「背景層」。

背景面板類別實作

import javax.swing.JPanel;
import java.awt.*;
import java.awt.image.ImageObserver;

public class CustomImgPanel extends JPanel {
    private int width, height;
    private final String imgPath;

    public CustomImgPanel(int w, int h, String path) {
        this.width = w; this.height = h; this.imgPath = path;
        setSize(width, height); setVisible(true);
    }
    public CustomImgPanel(double w, double h, String path) {
        this((int)w, (int)h, path);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Image img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(imgPath));
        g2.drawImage(img, 0, 0, width, height, this);
    }
}

使用方式

// 初始化:取得螢幕尺寸扣除標題列與狀態列高度
double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double h = Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 70;
CustomImgPanel imgPanel = new CustomImgPanel(w, h, "../form/images/mainBg.jpg");
mainPanel.add(imgPanel, -1); // -1 代表最底層

處理視窗大小變更

監聽父視窗的 ComponentEvent,重建背景面板以適應新尺寸:

private void formComponentResized(ComponentEvent evt) {
    try { mainPanel.remove(imgPanel); } catch (Exception ignored) {}
    imgPanel = null;
    Dimension sz = evt.getComponent().getSize();
    imgPanel = new CustomImgPanel(sz.getWidth(), sz.getHeight() - 70, "../form/images/mainBg.jpg");
    mainPanel.add(imgPanel, -1);
    mainPanel.revalidate();
    mainPanel.repaint();
}

關鍵細節

  • 使用 Toolkit.getImage 非同步載入圖片,配合 ImageObserver(this)自動觸發重繪。
  • 每次 resize 先移除舊面板並設為 null,避免殘留引用與重疊。
  • 圖片路徑使用相對路徑 getClass().getResource(),利於打包部署。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved