Volendo un tipo di griglia per un editor di pixel

Attualmente sto cercando di sviluppare un’applicazione di editor di pixel di base per sviluppare la mia esperienza di programmazione con Java. Lo sto progettando in modo che l’utente abbia diverse opzioni di colore, fanno clic su un’opzione e poi possono trascinare le celle nella griglia e cambiano colore (come un tipico editor di immagini, ma con una sorta di snap su ogni griglia cellula)

Qualche idea su quale componente Java, se esiste, è in grado di implementare questo tipo di griglia in Java?

Avevo pensato che ogni cella fosse un JButton, ma questo sembrava terribilmente inefficiente e non penso che sarebbe ansible cambiare il colore di ogni cella (pulsante) senza fare clic su ognuno di essi.

Qualsiasi aiuto apprezzato.

Più di poche centinaia di componenti è imbarazzante. Un modo semplice per ottenere i pixel grandi è usare drawImage() e scalare le coordinate del mouse di conseguenza. Ecco un semplice esempio.

immagine dello schermo

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; /** @see http://stackoverflow.com/questions/2900801 */ public class Grid extends JPanel implements MouseMotionListener { private final BufferedImage img; private int imgW, imgH, paneW, paneH; public Grid(String name) { super(true); Icon icon = UIManager.getIcon(name); imgW = icon.getIconWidth(); imgH = icon.getIconHeight(); this.setPreferredSize(new Dimension(imgW * 10, imgH * 10)); img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = (Graphics2D) img.getGraphics(); icon.paintIcon(null, g2d, 0, 0); g2d.dispose(); this.addMouseMotionListener(this); } @Override protected void paintComponent(Graphics g) { paneW = this.getWidth(); paneH = this.getHeight(); g.drawImage(img, 0, 0, paneW, paneH, null); } @Override public void mouseMoved(MouseEvent e) { Point p = e.getPoint(); int x = px * imgW / paneW; int y = py * imgH / paneH; int c = img.getRGB(x, y); this.setToolTipText(x + "," + y + ": " + String.format("%08X", c)); } @Override public void mouseDragged(MouseEvent e) { } private static void create() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new Grid("Tree.closedIcon")); f.pack(); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { create(); } }); } } 

Un’opzione consiste nell’utilizzare una canvas di grandi dimensioni e intercettare gli eventi su di essa. Disegna tutto il necessario nel metodo paint (g).