在网上搜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]的图片都是最后一幅图
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]的图片都是最后一幅图
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);
}}
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();}