JPanel 的paintComponent()调用问题

zjjh8877227 2010-07-15 04:39:00
在网上搜JPanel加载图片一般都是

testPane = new JPanel(){
public void paintComponent(Graphics g) {
ImageIcon icon = new ImageIcon(filePath);
// 图片随窗体大小而变化
g.drawImage(icon.getImage(), 0, 0, 240,270,this);
}
};

但是对于多个图片,假设是个JPanel的数组,用这个办法就会得到重复的图片了,因为在每次testPane[k] = new JPanel(){
........};的时候,paintComponent(Graphics g)根本没有被调用,要等全部都声明完了才调用,这时filePath就变成循环中的最后那个值,整个JPanel所加载的图片都是一样的了

不知道有没有在外部调用的函数,让我每次声明完数组的一项如testPane[k]之后,马上调用paintComponent(Graphics g),而不是等到数组的所有项都声明完才调用这个函数?
下面附上代码:

labelA : for(int i=1;i<=(numOfScanDoc/4+1);i++){//图片数量
for(int j=1;j<=4;j++){
k = (i-1)*4+j;
if(k>numOfScanDoc){
break labelA;
}
filePath = "E:\\TeleArchive\\"+k+".jpg";
testPane[k] = new JPanel(){
public void paintComponent(Graphics g) {
ImageIcon icon = new ImageIcon(filePath);
// 图片随窗体大小而变化
g.drawImage(icon.getImage(), 0, 0, 240,270,this);
}
};

结果是所有 testPane[k]的图片都是最后一幅图
...全文
319 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjjh8877227 2010-07-16
  • 打赏
  • 举报
回复
解决了,原来继承是那么的有用,现在总算明白了
zjjh8877227 2010-07-15
  • 打赏
  • 举报
回复
你的意思是自己写个JPanel的继承类,然后每次new 的时候就可以把Image传递给它的构造函数,然后就可以调用它的paintComponent();?哈哈,我明天试试,应该是可以的
bear13 2010-07-15
  • 打赏
  • 举报
回复
漏了一个


package org.dbcc.util;

import java.awt.Image;

import javax.swing.ImageIcon;

public class ResourceUtil {

public static final Image FASHION_BUTTON_NORMAL_IMAGE=new ImageIcon(ResourceUtil.class.getResource("/icon/fashionButton_Normmal.gif")).getImage();
public static final Image FASHION_BUTTON_ACTIVE_IMAGE=new ImageIcon(ResourceUtil.class.getResource("/icon/fashionButton_Active.gif")).getImage();

}
bear13 2010-07-15
  • 打赏
  • 举报
回复
我搞了一下,不知道是不是你要解决的.


package org.dbcc.ztest;

import java.awt.*;

import javax.swing.*;

import org.dbcc.util.ResourceUtil;
import org.dbcc.ztest.JTestPanel;

public class testPanel {

private static final Image normalImg=ResourceUtil.FASHION_BUTTON_NORMAL_IMAGE;
private static final Image activeImg=ResourceUtil.FASHION_BUTTON_ACTIVE_IMAGE;
private static final Image[] imageArray=new Image[]{normalImg,activeImg};

private JFrame f = new JFrame("测试");
private Box horizontal = Box.createHorizontalBox();


public void init(){

for(int i=0;i<2;i++){
horizontal.add(new JTestPanel(imageArray[i]));
f.add(horizontal);
}

f.setSize(415,280);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args){
new testPanel().init();
}

}




package org.dbcc.ztest;

import java.awt.*;

import javax.swing.*;

public class JTestPanel extends JPanel{

protected Image image;

public JTestPanel(Image image){

super();
this.image=image;


}

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

if (this.image != null)
g.drawImage(this.image, 0, 0, getWidth(), getHeight(), 0, 0,
this.image.getWidth(null), this.image.getHeight(null), null);
}

}

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧