2010-05-24 9 views
5

Je suis actuellement en train d'essayer de développer une application de base d'éditeur de pixels pour construire mon expérience de programmation avec Java. Je le conçois pour que l'utilisateur ait plusieurs options de couleurs, il clique sur une option et ensuite il peut glisser sur les cellules de la grille et changer de couleur (comme un éditeur d'image typique, mais avec une sorte d'accrochage sur chaque grille cellule)Vouloir un type de grille pour un éditeur de pixels

Une idée de quel composant Java, le cas échéant, est capable d'implémenter ce type de grille en Java? J'avais pensé à chaque cellule étant un JButton, mais cela semblait terriblement inefficace et je ne pense pas qu'il serait possible de changer la couleur de chaque cellule (bouton) sans cliquer individuellement sur chacun d'eux.

Toute aide appréciée.

+1

Vous pouvez consulter ce lien out .. Les concepts de base sont toujours importants et très utiles. http://java.sun.com/docs/books/tutorial/uiswing/ –

+0

Hey tout progrès sur votre éditeur de pixels? J'essaie d'en créer un moi-même. L'avez-vous sur le hub GIT ou tout autre dépôt public? –

+0

Désolé Jose, je me suis débarrassé il y a un certain temps, j'ai peur :( – wiggles

Répondre

8

Plus de quelques centaines de composants sont encombrants. Un moyen facile d'obtenir de gros pixels est d'utiliser drawImage() et de mettre à l'échelle les coordonnées de la souris en conséquence. Voici un exemple simple.

screenshot

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 = p.x * imgW/paneW; 
     int y = p.y * 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(); 
      } 
     }); 
    } 
} 
+0

+1 très bel exemple d'icône à BufferedImage –

+1

Exemple marginalement acceptable d'utilisation ['setPreferredSize()'] (http://stackoverflow.com/ q/7229226/230513). :-) – trashgod

2

Une option consiste à utiliser un grand canevas et à intercepter les événements. Dessinez ce dont vous avez besoin dans la méthode de peinture (g).