Je zult helaas voor eeuwig van me moeten gaan houden:
Bekijk bijlage Dragendropwerkend.zip
Ik gebruik in deze werkende versie geen JPanels maar JLabels met een Icon.
bij de klasse ColorIcon wordt er een icon gemaakt van de kleur.
code:
ColorIcon
[CPP]import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.Icon;
public class ColorIcon implements Icon
{// Instance variables
private int HEIGHT = 100;
private int WIDTH = 100;
private Color color = Color.white;
// Constructors
public ColorIcon(Color color)
{
this.color = color;
}
public ColorIcon(Color color, int width, int height)
{
setHeigt(height);
setWidth(width);
this.color = color;
}
// Getters and setters
public void setHeigt(int xheight){
this.HEIGHT = xheight;
}
public void setWidth(int xwidth){
this.WIDTH = xwidth;
}
public int getIconHeight()
{
return HEIGHT;
}
public int getIconWidth()
{
return WIDTH;
}
// make the icon appear (paintcomponent)
public void paintIcon(Component c, Graphics g, int x, int y)
{
g.setColor(color);
g.fillRect(x, y, WIDTH - 1, HEIGHT - 1);
g.setColor(Color.black);
g.drawRect(x, y, WIDTH - 1, HEIGHT - 1);
}
}[/CPP]
GridPanel
[CPP]import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Gridpanel extends JPanel {
public Gridpanel(){
this.setLayout(new GridLayout(2,2));
// Maak colourpanels voor in de grid en maak ze niet draggable door false toe te voegen.
this.add(new Colourpanel(Color.yellow, false));
this.add(new Colourpanel(Color.blue, false));
this.add(new Colourpanel(Color.red, false));
this.add(new Colourpanel(Color.green, false));
}
}
[/CPP]
Colourpanel
[CPP]import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.TransferHandler;
@SuppressWarnings("serial")
public class Colourpanel extends JLabel {
/*
*Je hoeft in deze klasse niet altijd een boolean mee te geven.
*Om netheid in de rest van je code te behouden zou ik dat dus
*ook niet doen als ze draggable moeten zijn (of andersom als er meer niet draggable zijn)
**/
// Als je geen true of false meegeeft nadat je een color meegeeft pakt hij deze constructor
public Colourpanel(Color c){
this.addMouseListener(new DragMouseAdapter());
this.setIcon(new ColorIcon(c, 100,100));
setTransferHandler(new TransferHandler("icon"));
this.setOpaque(true);
}
// Als je wel true of false meegeeft pakt hij deze constructor
public Colourpanel(Color c, boolean draggable){
if (draggable){//je kunt gebruiken if (draggable == true)
this.addMouseListener(new DragMouseAdapter());
}
this.setIcon(new ColorIcon(c, 100,100));
setTransferHandler(new TransferHandler("icon"));
this.setOpaque(true);
}
}
[/CPP]
DragMouseAdapter
[CPP]
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
public class DragMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent) e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.COPY);
}
}
[/CPP]