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

JPanel 設定背景圖片兩種實用做法(含自適應與平鋪模式)

     編輯:Java 相關知識

方法一:繼承 JPanel 覆寫 paintComponent(自適應拉伸)

建立自訂 ImagePanel,建構子傳入 Image,在 paintComponent 繪製並拉伸至面板大小。

import java.awt.*;
import javax.swing.*;

public class ImagePanel extends JPanel {
    private Image image;

    public ImagePanel(Image image) {
        this.image = image;
        // 可選:設定面板大小為螢幕尺寸
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screen.width, screen.height);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 清除背景
        if (image != null) {
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        }
    }
}

使用方式

Image img = Toolkit.getDefaultToolkit().getImage("bg.jpg");
JPanel panel = new ImagePanel(img);
frame.add(panel);

方法二:直接在 JPanel 匿名類別中繪製(支援平鋪)

適用於簡單專案,不需額外類別。此範例示範圖片平鋪覆蓋整個面板。

import java.awt.*;
import java.net.URL;
import javax.swing.*;

public class Demo extends JFrame {
    public Demo() {
        super("背景圖片示範");
        JPanel panel = new JPanel() {
            private Image bgImage;

            {
                // 從 classpath 載入圖片
                URL imgURL = getClass().getResource("test.jpg");
                if (imgURL != null) {
                    bgImage = new ImageIcon(imgURL).getImage();
                }
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (bgImage == null) return;

                int imgW = bgImage.getWidth(this);
                int imgH = bgImage.getHeight(this);
                int panelW = getWidth();
                int panelH = getHeight();

                // 平鋪繪製
                for (int y = 0; y < panelH; y += imgH) {
                    for (int x = 0; x < panelW; x += imgW) {
                        g.drawImage(bgImage, x, y, this);
                    }
                }
            }
        };

        getContentPane().add(panel);
        setSize(596, 298);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Demo();
    }
}

關鍵差異比較

特性方法一(拉伸)方法二(平鋪)
圖片比例拉伸填滿,可能變形保持原始比例,重複平鋪
適用場景大尺寸背景圖、漸層圖紋理圖案、小圖片重複
效能單次繪製,較快多次繪製,圖片小面板大時較慢

進階技巧

  • 雙緩衝:`setDoubleBuffered(true)` 減少閃爍(JPanel 預設開啟)。
  • 圖片快取:建構子載入一次,避免 `paintComponent` 重複讀取。
  • 背景透明:`setOpaque(false)` 讓父容器背景顯現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved