[求助]java Swing repaint后不能显示图片

public class MyDisplayPanel extends JPanel implements Runnable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3762463934330970468L;
	// 窗体的宽与高
	private static final int PLAY_DELY = 200;
	public static final int WIDTH = 80;

	public static final int HEIGHT = 80;

	private List<Image> listImages = new ArrayList<Image>();

	private Thread refreshThread;

	private boolean hasPicture = false;

	private int index;

	private final MyCanvas canvas;

	public MyDisplayPanel() {
		canvas = new MyCanvas();
		//
		this.add(canvas);
		this.setOpaque(false);
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
		refreshThread = new Thread(this);
		refreshThread.start();

	}

	public boolean loadImages(String name) throws IOException {
		File dir = new File(name);
		if (dir.isDirectory()) {
			// remove all image in the list
			if (listImages.size() > 0) {
				initData();
			}
			// load images
			int num = dir.listFiles().length;
			for (int i = 0; i < num; i++) {
				Image image = ImageIO.read(new File(name + "/" + (i + 1)
						+ ".png"));
				listImages.add(image);
			}

			hasPicture = true;
			return true;
		}
		return false;
	}

	private void initData() {
		listImages.removeAll(listImages);
		hasPicture = false;
		index = 0;
	}

	private void increaseIndex() {
		index++;
		// restart from 0th picture
		if (index == listImages.size()) {
			index = 0;
		}

	}

	@Override
	public void run() {
		while (true) {
			if (hasPicture) {
				canvas.repaint();
				this.repaint();
			}
			try {
				Thread.sleep(PLAY_DELY);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}


	class MyCanvas extends Canvas {

		public MyCanvas() {
			setPreferredSize(new Dimension(WIDTH, HEIGHT));
		}

		@Override
		public void update(Graphics g) {
			if (listImages.size() > 0) {
				g.drawImage(listImages.get(index), 0, 0, null);
				System.out.print(index);
				g.dispose();
				increaseIndex();
			}
		}

		@Override
		public void paint(Graphics g) {
			update(g);
		}

	}

}

我原来是这样写的,反而是可以运行的。后来我想把JPanel和Canvas封装在一起就成为上面的版本了,就不知道为什么不能把图片画出来了。


public class MyCanvas extends Canvas implements Runnable {

	// 窗体的宽与高
	private static final int PLAY_DELY = 200;
	public static final int WIDTH = 80;

	public static final int HEIGHT = 80;

	private List<Image> listImages = new ArrayList<Image>();

	private Thread refreshThread;

	private boolean hasPicture = false;

	private int index;
	private JPanel panel;

	/**
	 * 
	 * @param width
	 * @param height
	 * @param flag
	 * @return
	 */

	public MyCanvas(JPanel panel) {
		this.panel = panel;
		// 设定初始构造时面板大小
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
		// 初始导入一张图片

		refreshThread = new Thread(this);
		refreshThread.start();
	}

	public boolean loadImages(String name) throws IOException {
		File dir = new File(name);
		if (dir.isDirectory()) {
			// remove all image in the list
			if (listImages.size() > 0) {
				initData();
			}
			// load images
			int num = dir.listFiles().length;
			for (int i = 0; i < num; i++) {
				Image image = ImageIO.read(new File(name + "/" + (i + 1)
						+ ".png"));
				listImages.add(image);
			}

			hasPicture = true;
			return true;
		}
		return false;
	}

	private void initData() {
		listImages.removeAll(listImages);
		hasPicture = false;
		index = 0;
	}

	@Override
	public void update(Graphics g) {
		if (listImages.size() > 0) {
			g.drawImage(listImages.get(index), 0, 0, null);
			g.dispose();
			increaseIndex();
		}
	}

	private void increaseIndex() {
		index++;
		// restart from 0th picture
		if (index == listImages.size()) {
			index = 0;
		}

	}

	@Override
	public void paint(Graphics g) {
		update(g);
	}

	@Override
	public void run() {
		while (true) {
			if (hasPicture) {
				this.repaint();
				panel.repaint();
			}
			try {
				Thread.sleep(PLAY_DELY);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答:根据你提供的引用内容,你遇到的问题是在浏览器中使用Javarepaint()方法时,屏幕没有更新。repaint()方法是用于请求组件重新绘制自己的方法。然而,根据你的描述,你在浏览器中运行游戏时只看到一个白色屏幕,这可能是由于浏览器对Java Applet的支持不完全导致的。在浏览器中,Java Applet的绘制可能受到限制,因此repaint()方法可能无法正常工作。你可以尝试以下几个解决方法: 1. 确保你的浏览器已经启用了Java插件,并且使用的是最新版本的Java插件。 2. 检查你的代码是否有任何与浏览器兼容性相关的问题。例如,你可能需要使用适当的布局管理器来确保组件正确绘制。 3. 尝试使用其他浏览器来运行你的游戏,看看是否有任何改善。 4. 如果可能的话,考虑使用其他技术来实现你的游戏,例如HTML5和JavaScript,这些技术在浏览器中的兼容性更好。 希望这些解决方法能帮助你解决问题。如果问题仍然存在,请提供更多的细节,以便我能够更好地帮助你。 #### 引用[.reference_title] - *1* *2* [Java repaint()在浏览器中不起作用](https://blog.csdn.net/weixin_39614546/article/details/114782958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值