Drag & Drop zwischen Panels

prog1

Mitglied
Hallo,

ich bin gerade dabei Dame zu programmieren. Leider hänge ich gerade an einem Problem mit der GUI. Ich möchte die Figuren gerne per Drag and Drop verschieben lassen. Das Spielfeld habe ich mit 8 x 8 JPanels ausgestattet. Leider sind meine Figuren nicht mehr sichtbar, wenn ich sie in ein anderes JPanel bewegen möchte. Was muss ich noch beachten, damit die Figuren immer sichtbar bleiben beim bewegen über andere JPanels?

Hier sind meine 3 Klassen:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.OverlayLayout;

public class CheckerFrame extends JFrame {

    private final static long serialVersionUID = 90L;
    private JPanel area;
    private CheckerField[][] fields;

    public CheckerFrame() {
        // Frame
        super("Dame");
        setSize(700, 700);
        setLocationRelativeTo(getParent());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Panel area
        area = new JPanel();
        area.setLayout(new GridLayout(8, 8));

        // fields
        fields = new CheckerField[8][8];

        // create and add fields
        for (int i = 0; i < fields.length; i++) {
            for (int y = 0; y < fields[i].length; y++) {
                fields[i][y] = new CheckerField();
                area.add(fields[i][y]);
            }
        }

        // add tokens first
        Color first = new Color(0, 191, 255);
        fields[0][1].add(BorderLayout.CENTER, new Token(first));
        fields[0][3].add(BorderLayout.CENTER, new Token(first));
        fields[0][5].add(BorderLayout.CENTER, new Token(first));
        fields[0][7].add(BorderLayout.CENTER, new Token(first));
        fields[1][0].add(BorderLayout.CENTER, new Token(first));
        fields[1][2].add(BorderLayout.CENTER, new Token(first));
        fields[1][4].add(BorderLayout.CENTER, new Token(first));
        fields[1][6].add(BorderLayout.CENTER, new Token(first));
        fields[2][1].add(BorderLayout.CENTER, new Token(first));
        fields[2][3].add(BorderLayout.CENTER, new Token(first));
        fields[2][5].add(BorderLayout.CENTER, new Token(first));
        fields[2][7].add(BorderLayout.CENTER, new Token(first));
        // add toekns second
        Color second = new Color(221, 160, 221);
        fields[5][0].add(BorderLayout.CENTER, new Token(second));
        fields[5][2].add(BorderLayout.CENTER, new Token(second));
        fields[5][4].add(BorderLayout.CENTER, new Token(second));
        fields[5][6].add(BorderLayout.CENTER, new Token(second));
        fields[6][1].add(BorderLayout.CENTER, new Token(second));
        fields[6][3].add(BorderLayout.CENTER, new Token(second));
        fields[6][5].add(BorderLayout.CENTER, new Token(second));
        fields[6][7].add(BorderLayout.CENTER, new Token(second));
        fields[7][0].add(BorderLayout.CENTER, new Token(second));
        fields[7][2].add(BorderLayout.CENTER, new Token(second));
        fields[7][4].add(BorderLayout.CENTER, new Token(second));
        fields[7][6].add(BorderLayout.CENTER, new Token(second));

        // add Frame
        getContentPane().add(BorderLayout.CENTER, area);

        setVisible(true);

    }

    public static void main(String[] args){

        CheckerFrame checker = new CheckerFrame();
    }

}
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;

public class CheckerField extends JPanel {

    private final static long serialVersionUID = 12L;
    private static int xCounter = 0;
    private static int yCounter = 0;
    private static int counter = 0;
    private int x;
    private int y;

    public CheckerField() {

        setLayout(new BorderLayout());

        if (counter % 2 == 0) {
            setBackground(new Color(222, 184, 135));
        } else {
            setBackground(new Color(105, 105, 105));
        }

        x = xCounter;
        y = yCounter;

        if (xCounter == 7) {
            yCounter++;
            xCounter = 0;
            counter++;
        } else {
            xCounter++;
        }

        // to set Color
        counter++;

        // Listener
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.out.println(y + "," + x);
            }
        });

    }
}
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JPanel;

public class Token extends JPanel {

    private final static long serialVersionUID = 9L;
    private Color color;
    private int size;
    private int x;
    private int y;
    private int count = 0;

    public Token(Color color) {
        this.color = color;
        setOpaque(false);

        // Listener
        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                x = e.getX() - (size / 2);
                y = e.getY() - (size / 2);
                repaint();
            }
        });

        // Circle
        size = 60;

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (count < 1) {
            x = (getParent().getWidth() / 2) - (size / 2);
            y = (getParent().getHeight() / 2) - (size / 2);
        }
        g.setColor(color);
        g.drawOval(x, y, size, size);
        g.fillOval(x, y, size, size);
        count++;
    }

}
 

Zurück
Oben