java 2d puzzle application, ne peut pas dessiner plus d'une seule pièce


J'essaie d'écrire une application de puzzle où une image est coupée en morceaux, brouillée, et l'utilisateur doit les réorganiser avec glisser-déposer pour réassembler l'image originale. (quelque chose comme ceci: http://www.jigzone.com/puzzles/74055D549FF0?z=5). je dois écrire ceci en java avec Graphics2d.

Donc, au début, j'essaie de faire une sorte de composant qui peut montrer une partie de l'image (un rectangle pour l'instant), et peut être traîné avec la souris.

Le code ci-dessous fonctionne bien quand il y a une seule composante. le problème est que lorsque j'ajoute le deuxième composant, le premier n'est plus visible.

Je suis vraiment coincé ici. j'ai le sentiment qu'il me manque quelque chose de vraiment basique. ou peut-être que je suis sur une mauvaise voie. toute aide sera grandement appréciée.

Edit: j'ai changé un peu le code selon les suggestions, cependant, ne fonctionne toujours pas comme prévu.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;

public class GraphicDragAndDrop extends JPanel {
    Rectangle rect;
    Image img;

    public GraphicDragAndDrop(String imgFile, int x0, int y0){
        rect = new Rectangle(x0, y0, 150, 75);
        img = new ImageIcon(imgFile).getImage();
    }


    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.setClip(rect);
        int x = rect.x;
        int y = rect.y;
        g2d.drawImage(img, x, y, this);
    }

    public void setRect(int x, int y) {
        rect.setLocation(x, y);
        repaint();
    }

    public static void main(String[] args) {
        // first piece
        GraphicDragAndDrop piece1 = new GraphicDragAndDrop("a.png", 0, 0);
        piece1.setRect(0, 0);
        new GraphicDragController(piece1);

        // second piece --> only this will be visible
        GraphicDragAndDrop piece2 = new GraphicDragAndDrop("a.png", 200, 200);
        //GraphicDragAndDrop piece2 = new GraphicDragAndDrop("b.png", 200, 200); // does'n work either
        piece2.setRect(150, 150);
        new GraphicDragController(piece2);

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(piece1);
        f.add(piece2);
        f.setSize(500,500);
        f.setLocation(300,100);
        f.setVisible(true);
    }
}

class GraphicDragController extends MouseInputAdapter {
    GraphicDragAndDrop component;
    Point offset = new Point();
    boolean dragging = false;

    public GraphicDragController(GraphicDragAndDrop gdad) {
        component = gdad;
        component.addMouseListener(this);
        component.addMouseMotionListener(this);
    }

    public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        Rectangle r = component.rect;
        if(r.contains(p)) {
            offset.x = p.x - r.x;
            offset.y = p.y - r.y;
            dragging = true;
        }
    }

    public void mouseReleased(MouseEvent e) {
        dragging = false;
    }

    public void mouseDragged(MouseEvent e) {
        if(dragging) {
            int x = e.getX() - offset.x;
            int y = e.getY() - offset.y;
            component.setRect(x, y);
        }
    }
}
Author: Luc, 2013-05-07

1 answers

Votre code ci-dessus est écrit pour dessiner une seule image:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setClip(rect);
    int x = rect.x;
    int y = rect.y;

    // here
    g2d.drawImage(new ImageIcon("a.png").getImage(), x, y, this);
}
  • Si vous devez dessiner plus d'une image, envisagez de créer une collection d'images et de parcourir la collection dans paintComponent en utilisant une boucle for:
  • de plus, ne jamais lire dans l'image à partir de paintComponent car cette méthode doit être maigre, moyenne et rapide, et ne devrait concerner que la peinture. En outre, il n'est pas nécessaire de lire l'image à chaque fois que votre programme doit dessinez-le car c'est très inefficace et ralentira inutilement le programme. Lisez plutôt l'image dans une fois dans le constructeur ou une méthode d'initialisation similaire.

Par exemple

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;

    for (Image img: myImageCollection) {
       g2d.drawImage(img, 0, 0, this);
    }
}

Modifier
Vous déclarez:

De plus, mon plan était d'avoir plus d'objets de la classe GraphicDragAndDrop, chacun d'eux montrant un morceau différent de l'image originale. mon approche de mal?

Vous pouvez utiliser des composants, mais j'ai le sentiment qu'il serait facile de faire glisser des images. Je pense qu'il serait plus facile de les faire pivoter par exemple si vous voulez que votre programme ait cette fonctionnalité. Sinon, bien sûr, utilisez un composant, mais si vous empruntez cette voie, je recommanderais d'utiliser un JLabel et de simplement définir son ImageIcon plutôt que de faire glisser des JPanels.

 1
Author: Hovercraft Full Of Eels, 2013-05-07 20:57:51