swing容器继承重绘问题解决

以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码:
package ui;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class JJPanel extends JPanel {
    
    private static final long serialVersionUID = 1L;

    BufferedImage bufImg;
    Graphics2D g2d;
    private Image img;  
    private static String imgPath=" ";
    public JJPanel(String imgPath) {
     setImgPath(imgPath);
    }
    public void paintComponent(Graphics g) {
        img=new ImageIcon(getImgPath()).getImage();
    setOpaque(false);// 设置false以便于设置背景
    // 启用图像缓存设置好图像。
    bufImg = new BufferedImage(img.getWidth(null),
            img.getHeight(null), BufferedImage.TYPE_3BYTE_BGR);
    g2d = bufImg.createGraphics();
    g2d.drawImage(img, 0, 0, null);
    g2d.dispose();// 释放资源
    // 准备矩形,用来创建一个纹理填充
    Rectangle rectan = new Rectangle(0, 0, img.getWidth(null),
            img.getHeight(null));
    TexturePaint tu = new TexturePaint(bufImg, rectan);
    // 用创建的纹理填充来填充整个面板
    g2d = (Graphics2D) g;
    g2d.setPaint(tu);
    g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
    super.paintComponent(g);

}
    public void repaint() {
        img=new ImageIcon(getImgPath()).getImage();
        super.repaint();
    }
    
    /**
     * @return the imagePath
     */
    public  String getImgPath() {
        return imgPath;
    }
    /**
     * @param imagePath the imagePath to set
     */
    public static void setImgPath(String imgPath) {
        JJPanel.imgPath = imgPath;
    }
}
简单的重写paintcomponent()方法发现动态修改imgPath,无法重绘组件,原因就在还要重写repaint()方法,并及时把修改好的imgPath传到repaint()中,这样方可动态重绘.

转载于:https://my.oschina.net/xby1993/blog/138815

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值