Método de swing similar a canvas.putImageData de HTML5 (arrayOfPixels, 0,0)

Tengo un código JavaScript que actúa sobre una matriz de píxeles definida así:

screen = {'width':160, 'height':144, 'data':new Array(160*144*4)}; ... canvas.putImageData(GPU._scrn, 0,0); 

Donde la pantalla es 1D matriz de ancho * alto * 4 valores que representan los colores como se detalla aquí: https://developer.mozilla.org/En/HTML/Canvas/Pixel_manipulation_with_canvas

¿Hay algún método conveniente para pintar esta matriz en la pantalla como está? Si no, ¿cuál es la forma más fácil de pintar esta matriz usando Swing?

BufferedImage es probablemente la opción más flexible. Puede usarlo como un Icon o anular paintComponent() para la generalidad completa de Java2D .

PiRaster

 package overflow; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** @see http://stackoverflow.com/questions/7298492 */ public class PiRaster extends JPanel { private static final int W = 30; private static final int H = 30; private static List pi = new ArrayList(); private final List clut = new ArrayList(); private BufferedImage image; public PiRaster() { this.setPreferredSize(new Dimension(W * 16, H * 10)); String s = "" + "31415926535897932384626433832795028841971693993751" + "05820974944592307816406286208998628034825342117067" + "98214808651328230664709384460955058223172535940812" + "84811174502841027019385211055596446229489549303819" + "64428810975665933446128475648233786783165271201909" + "14564856692346034861045432664821339360726024914127"; for (int i = 0; i < s.length(); i++) { pi.add(s.charAt(i) - '0'); } for (int i = 0; i < 10; i++) { clut.add(Color.getHSBColor(0.6f, i / 10f, 1).getRGB()); } image = new BufferedImage(W, H, BufferedImage.TYPE_INT_ARGB); int i = 0; for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { image.setRGB(col, row, clut.get(pi.get(i))); if (++i == pi.size()) { i = 0; } } } } private static class ClutPanel extends JPanel { private int i; public ClutPanel(List rgbList) { this.setLayout(new GridLayout(1, 0)); for (Integer rgb : rgbList) { JLabel label = new JLabel(String.valueOf(i++), JLabel.CENTER); label.setOpaque(true); label.setBackground(new Color(rgb)); this.add(label); } } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, getWidth(), getHeight(), null); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); PiRaster pr = new PiRaster(); Icon icon = new ImageIcon(pr.image); frame.add(new JLabel(icon), BorderLayout.WEST); frame.add(pr, BorderLayout.CENTER); frame.add(new ClutPanel(pr.clut), BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } }); } }