如何逐个绘制图像?

class DrawIma extends JPanel{ protected void paintComponent(Graphics g) { super.paintComponent(g); for (int i=0;i<20;i++){ for (int j=0;j<20;j++) { g.drawImage(BuArr[i*20+j], 20*i, 20*j, 20, 20, null); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } } 

在这部分中, BuArr是从BufferedImage划分的400个块 ,现在我希望它们逐个绘制,但是方法不能单独绘制块,我该怎么做?

Swing是单线程而不是线程安全的。

这意味着您不应在IU线程(事件调度线程)中执行任何长时间运行或阻塞( Thread.sleep )操作。 这也意味着您无法在EDT上下文之外更新,修改或创建UI元素。

相反,使用Swing Timer以指定的间隔生成重复的回调,并将图像的部分渲染为类似BufferedImage东西,您可以通过其paintComponent方法绘制到组件…

有关更多详细信息,请参阅Swing中的并发和如何使用Swing Timers

因为这是一个浪费的好时光

这会生成一个Rectangles List ,它代表我想要绘制的各个块,然后随机化List并运行Timer ,从List选择最顶层的Rectangle并使用BufferedImage#getSubImage将它从master绘制到缓冲区,画到了画面……

下雨的像素

 import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestImage { public static void main(String[] args) { new TestImage(); } public TestImage() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private BufferedImage master; private BufferedImage copy; private List blocks; public TestPane() { setBackground(Color.BLACK); try { master = ImageIO.read(new File("...")); copy = new BufferedImage(master.getWidth(), master.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = copy.createGraphics(); AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f); g2d.setComposite(composite); g2d.setColor(new Color(0, 0, 0, 0)); g2d.fillRect(0, 0, master.getWidth(), master.getHeight()); g2d.dispose(); int blockSize = 40; int width = master.getWidth(); int height = master.getHeight(); float aspect = Math.min(width, height) / (float) Math.max(width, height); int blockHeight = blockSize; blocks = new ArrayList<>(blockSize * 2); for (int y = 0; y < master.getHeight(); y += blockHeight) { if (y + blockHeight > master.getHeight()) { blockHeight = master.getHeight() - y; } int blockWidth = blockSize; for (int x = 0; x < master.getWidth(); x += blockWidth) { if (x + blockWidth > master.getWidth()) { blockWidth = master.getWidth() - x; } Rectangle block = new Rectangle(x, y, blockWidth, blockHeight); blocks.add(block); } } Collections.shuffle(blocks); Timer timer = new Timer(40, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (blocks.isEmpty()) { ((Timer) e.getSource()).stop(); } else { Graphics2D g2d = copy.createGraphics(); Rectangle block = blocks.remove(0); g2d.drawImage(master.getSubimage(block.x, block.y, block.width, block.height), block.x, block.y, TestPane.this); g2d.dispose(); repaint(); } } }); timer.start(); } catch (IOException ex) { ex.printStackTrace(); } } @Override public Dimension getPreferredSize() { return master == null ? new Dimension(200, 200) : new Dimension(master.getWidth(), master.getHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (copy != null) { int x = (getWidth() - copy.getWidth()) / 2; int y = (getHeight() - copy.getHeight()) / 2; g2d.drawImage(copy, x, y, this); } g2d.dispose(); } } }