![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hallo, ich habe auf der SUN-seite ein beispiel mit drag & drop (images) entdeckt, das ich nutzen will. es geht darum: es wird eine frage gestellt, wo der user die möglichkeit hat, diese per drag & drop (images) zu beantworten. 10 images werden angezeigt, 5 sind davon richtig. der user beantwortet also die frage, indem er die images auf die vorgesehenen felder droppt und betätigt anschließend einen button, um seine antwort auf richtig oder falsch zu überprüfen. das grafische habe ich soweit fertig. mein problem ist nur, dass ich nicht rauskriegen kann, was der user geantwortet hat. zB bei einem jtextfielt habe ich die möglichkeit mit getText() an die antwort zu kommen, wie mache ich das in diesem fall? Ein Ansatz von mir war, über den Namen zu gehen. Aber irgendwas mache ich hier falsch. zB DTPicture eins soll den Namen der "gedraggten" Komponente erhalten. Hier meine Klassen. Vielleicht kann mir bitte jemand helfen? Code: public class Picture extends JComponent
implements MouseListener, FocusListener, Accessible {
/**
*
*/
private static final long serialVersionUID = -5579041754578833061L;
Image image;
String name;
public Picture(Image image, String name) {
this.image = image;
this.name = name;
System.out.println("this.name Picture: "+name);
setFocusable(true);
addMouseListener(this);
addFocusListener(this);
}
public void mouseClicked(MouseEvent arg0) {
requestFocusInWindow();
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void focusGained(FocusEvent fe) {
//Komponente bekommt einen roten Rand
this.repaint();
}
public void focusLost(FocusEvent fl) {
//Komponente bekommt einen schwarzen Rand
this.repaint();
}
protected void paintComponent(Graphics graphics) {
Graphics g = graphics.create();
g.setColor(Color.WHITE);
g.fillRect(0, 0, image == null ? 103 : image.getWidth(this),
image == null ? 62 : image.getHeight(this));
if (image != null) {
//image wird gezeichnet
g.drawImage(image, 0, 0, this);
}
//wenn das picture den focus hat, roten Rand zeichnen
if (isFocusOwner()) {
g.setColor(Color.RED);
}
else
{
g.setColor(Color.BLACK);
}
g.drawRect(0, 0, image == null ? 103 : image.getWidth(this),
image == null ? 62 : image.getHeight(this));
g.dispose();
}
}
Code: import java.awt.Image;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import javax.swing.TransferHandler;
/**
* Subclass von Picture, die den Datentransfer ermöglicht
*
*
*/
public class DTPicture extends Picture implements MouseMotionListener {
/**
*
*/
private static final long serialVersionUID = -7565390812902798045L;
private MouseEvent firstMouseEvent = null;
private static boolean installInputMapBindings = true;
public DTPicture(Image image, String name) {
super(image, name);
addMouseMotionListener(this);
if (installInputMapBindings) {
InputMap imap = this.getInputMap();
imap.put(KeyStroke.getKeyStroke("ctrl X"), TransferHandler.getCutAction().getValue(Action.NAME));
imap.put(KeyStroke.getKeyStroke("ctrl C"), TransferHandler.getCopyAction().getValue(Action.NAME));
imap.put(KeyStroke.getKeyStroke("ctrl V"), TransferHandler.getPasteAction().getValue(Action.NAME));
}
ActionMap map = this.getActionMap();
map.put(TransferHandler.getCutAction().getValue(Action.NAME), TransferHandler.getCutAction());
map.put(TransferHandler.getCopyAction().getValue(Action.NAME), TransferHandler.getCopyAction());
map.put(TransferHandler.getPasteAction().getValue(Action.NAME), TransferHandler.getPasteAction());
}
public void setImage(Image image) {
this.image = image;
this.repaint();
}
public void setName(String name) {
this.name = name;
}
public void mousePressed(MouseEvent me) {
//nicht draggen, wenn kein Image vorhanden
if (image == null)
return;
firstMouseEvent = me;
me.consume();
}
public void mouseDragged(MouseEvent md) {
//nicht draggen, wenn die Komponente kein image aufweist
if (image == null)
return;
if (firstMouseEvent != null) {
md.consume();
int ctrlMask = InputEvent.CTRL_DOWN_MASK;
int action = ((md.getModifiersEx() & ctrlMask ) == ctrlMask) ? TransferHandler.COPY : TransferHandler.MOVE;
int dx = Math.abs(md.getX() - firstMouseEvent.getX());
int dy = Math.abs(md.getY() - firstMouseEvent.getY());
//5 Pixel ist der Beginn von drag
if (dx > 5 || dy > 5) {
//das ist ein drag, kein klick
JComponent c = (JComponent)md.getSource();
TransferHandler handler = c.getTransferHandler();
//das ist ein drag
handler.exportAsDrag(c, firstMouseEvent, action);
firstMouseEvent = null;
}
}
}
public void MouseReleased(MouseEvent mr) {
firstMouseEvent = null;
}
public static void setInstallInputMapBindings(boolean status) {
installInputMapBindings = status;
}
public static boolean getInstallInputMapBindings() {
return installInputMapBindings;
}
public void mouseMoved(MouseEvent arg0) {
}
}
Code: import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.JComponent;
import javax.swing.TransferHandler;
class PictureTransferHandler extends TransferHandler {
DataFlavor pictureFlavor = DataFlavor.imageFlavor;
DTPicture sourcePic;
boolean shouldRemove;
public boolean importData(JComponent c, Transferable t) {
Image image;
String name = null;
if (canImport(c, t.getTransferDataFlavors())) {
DTPicture pic = (DTPicture)c;
//nicht auf mir selber droppen
if (sourcePic == pic) {
shouldRemove = false;
return true;
}
try {
image = (Image)t.getTransferData(pictureFlavor);
//Component auf das neue Picture setzen
pic.setImage(image);
pic.setName(name);
return true;
} catch (UnsupportedFlavorException ufe) {
System.out.println("importData: unsupported data flavor");
} catch (IOException ioe) {
System.out.println("importData: I/O exception");
}
}
return false;
}
protected Transferable createTransferable (JComponent c) {
sourcePic = (DTPicture)c;
shouldRemove = true;
return new PictureTransferable(sourcePic);
}
public int getSourceActions(JComponent c) {
return COPY_OR_MOVE;
}
protected void exportDone(JComponent c, Transferable data, int action) {
if (shouldRemove && (action == MOVE)) {
sourcePic.setImage(null);
}
sourcePic = null;
}
public boolean canImport(JComponent c, DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (pictureFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
class PictureTransferable implements Transferable {
private Image image;
PictureTransferable(DTPicture pic) {
image = pic.image;
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (!isDataFlavorSupported(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return image;
}
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { pictureFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return pictureFlavor.equals(flavor);
}
}
}
Code: public class DragDrop extends JFrame {
private static final long serialVersionUID = -2161168635983095623L;
private JPanel jContentPane = null;
private JPanel achtPanel = null;
private JLabel bild = null;
private JButton jButton5;
private DTPicture PAZgN, mGrWGrp, KdoGrp, StbGrp, VersGrp,
MKGrp, UZg, SSchGrp, JgZg3, sGrWZg,
eins, zwei, drei, vier, fuenf;
static String PAZgNString = "PAZgN";
static String mGrWGrpString = "mGrWGrp";
static String KdoGrpString = "KdoGrp";
static String StbGrpString = "StbGrp";
static String VersGrpString = "VersGrp";
static String MKGrpString = "MKGrp";
static String UZgString = "UZg";
static String SSchGrpString = "SSchGrp";
static String JgZg3String = "JgZg3";
static String sGrWZgString = "sGrWZg";
PictureTransferHandler picHandler;
/**
* This is the default constructor
*/
public DragDrop() {
super();
this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
this.setContentPane(getJContentPane());
this.setTitle("Die Jäger");
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.setBackground(Color.green);
jContentPane.setEnabled(false);
achtPanel = new JPanel();
achtPanel.setLayout(null);
achtPanel.setBackground(new java.awt.Color(208, 207,207));
achtPanel.setBounds(0, 0, 800, 500);
jContentPane.add(achtPanel);
picHandler = new PictureTransferHandler();
bild = new JLabel();
bild.setBounds(new java.awt.Rectangle(77,135,621,99));
bild.setIcon(new ImageIcon(getClass().getResource("images/JgKp ohne.png")));
bild.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
bild.setHorizontalTextPosition(javax.swing.SwingConstants.TRAILING);
bild.setVerticalAlignment(javax.swing.SwingConstants.TOP);
achtPanel.add(bild);
PAZgN = new DTPicture(createImageIcon("images/" + PAZgNString + ".jpg", PAZgNString).getImage(), "PAZgN");
PAZgN.setTransferHandler(picHandler);
PAZgN.setBounds(new java.awt.Rectangle(31, 317, 105, 63));
achtPanel.add(PAZgN);
mGrWGrp = new DTPicture(createImageIcon("images/" + mGrWGrpString + ".jpg", mGrWGrpString).getImage(), "mGrWGrp");
mGrWGrp.setTransferHandler(picHandler);
mGrWGrp.setBounds(183, 317, 105, 63);
achtPanel.add(mGrWGrp);
KdoGrp = new DTPicture(createImageIcon("images/" + KdoGrpString + ".jpg", KdoGrpString).getImage(), "KdoGrp");
KdoGrp.setTransferHandler(picHandler);
KdoGrp.setBounds(335, 317, 105, 63);
achtPanel.add(KdoGrp);
StbGrp = new DTPicture(createImageIcon("images/" + StbGrpString + ".jpg", StbGrpString).getImage(), "StbGrp");
StbGrp.setTransferHandler(picHandler);
StbGrp.setBounds(489, 317, 105, 63);
achtPanel.add(StbGrp);
VersGrp = new DTPicture(createImageIcon("images/" + VersGrpString + ".jpg", VersGrpString).getImage(), "VersGrp");
VersGrp.setTransferHandler(picHandler);
VersGrp.setBounds(640, 317, 105, 63);
achtPanel.add(VersGrp);
MKGrp = new DTPicture(createImageIcon("images/" + MKGrpString + ".jpg", MKGrpString).getImage(), "MKGrp");
MKGrp.setTransferHandler(picHandler);
MKGrp.setBounds(31, 392, 105, 63);
achtPanel.add(MKGrp);
UZg = new DTPicture(createImageIcon("images/" + UZgString + ".jpg", UZgString).getImage(), "UZg");
UZg.setTransferHandler(picHandler);
UZg.setBounds(183, 392, 105, 63);
achtPanel.add(UZg);
SSchGrp = new DTPicture(createImageIcon("images/" + SSchGrpString + ".jpg", SSchGrpString).getImage(), "SSchGrp");
SSchGrp.setTransferHandler(picHandler);
SSchGrp.setBounds(335, 392, 105, 63);
achtPanel.add(SSchGrp);
JgZg3 = new DTPicture(createImageIcon("images/" + JgZg3String + ".jpg", JgZg3String).getImage(), "JgZg3");
JgZg3.setTransferHandler(picHandler);
JgZg3.setBounds(489, 392, 105, 63);
achtPanel.add(JgZg3);
sGrWZg = new DTPicture(createImageIcon("images/" + sGrWZgString + ".jpg", sGrWZgString).getImage(), "sGrWZg");
sGrWZg.setTransferHandler(picHandler);
sGrWZg.setBounds(640, 392, 105, 63);
achtPanel.add(sGrWZg);
eins = new DTPicture(null, null);
eins.setTransferHandler(picHandler);
eins.setBounds(new java.awt.Rectangle(31, 234, 105, 63));
achtPanel.add(eins);
zwei = new DTPicture(null, null);
zwei.setTransferHandler(picHandler);
zwei.setBounds(new java.awt.Rectangle(183, 234, 105, 63));
achtPanel.add(zwei);
drei = new DTPicture(null, null);
drei.setTransferHandler(picHandler);
drei.setBounds(new java.awt.Rectangle(335, 235, 105, 63));
achtPanel.add(drei);
vier = new DTPicture(null, null);
vier.setTransferHandler(picHandler);
vier.setBounds(new java.awt.Rectangle(489, 235, 105, 63));
achtPanel.add(vier);
fuenf = new DTPicture(null, null);
fuenf.setTransferHandler(picHandler);
fuenf.setBounds(640, 234, 105, 63);
achtPanel.add(fuenf);
jButton5 = new JButton();
jButton5.setLocation(new java.awt.Point(717, 86));
jButton5.setIcon(new ImageIcon(getClass().getResource("/logo_button/okverwendet.png")));
jButton5.setPreferredSize(new java.awt.Dimension(50, 45));
jButton5.setSize(new java.awt.Dimension(50, 45));
jButton5.addActionListener(okListener);
achtPanel.add(jButton5);
return jContentPane;
}
protected static ImageIcon createImageIcon(String path, String description) {
java.net.URL imageURL = DragDrop.class.getResource(path);
if (imageURL == null) {
System.err.println("Resource not found: "+ path);
return null;
}
else {
return new ImageIcon(imageURL, description);
}
}
ActionListener okListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//String name = ((DTPicture)eins).getName();
//System.out.println(eins.getName());
//System.out.println("eins :"+name);
}
};
public static void main(String args[]) {
DragDrop dnd = new DragDrop();
dnd.setSize(800,600);
dnd.setVisible(true);
dnd.setResizable(false);
}
}
|
| | |
| | Nach oben #2 |
| Oliver O. Registriert seit: 17.08.2005
Beiträge: 426
|
Also, ich hab mir das ma angeschaut, und zwar noch net ganz verstanden, wie dass ganze jetzt läuft.... da wäre es praktisch, es in der praxis testen zu können. Dazu fehlen aber die bilder. viellecht könntest du die noch hoch laden?
|
| | |
| | Nach oben #4 |
| Erfahrener Benutzer Registriert seit: 23.11.2005 Ort: Stadtallendorf
Beiträge: 139
|
Könntest du Bitte auch posten woran es lag. Es kommen bestimmt noch mehr, die ein ähnliches Problem haben. Danke.
__________________ Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag. |
| | |
| | Nach oben #5 |
| Benutzer Registriert seit: 30.11.2005
Beiträge: 42
|
hallo, ich bin schon richtig gelegen mit meinem ersten ansatz nur habe ich ein paar dinge übersehen. wird ein neues DTPicture objekt erzeugt, den namen des bildes mitgeben. in diesem fall "PAZg". der datenaustausch darf nicht nur für das image durchgeführt werden, sondern auch für den namen. Code: DataFlavor nameFlavor = DataFlavor.stringFlavor; Drag-Source: Code: PAZg = new DTPicture(new ImageIcon(c4).getImage(), "PAZg"); PAZg.setTransferHandler(picHandler); PAZg.setBounds(31, 317, 105, 63); panel.add(PAZg); Code: eins = new DTPicture(null, null); eins.setTransferHandler(picHandler); eins.setBounds(31, 234, 105, 63); panel.add(eins); Code: antwort1 = ((DTPicture)eins).getName(); dndList.add(antwort1); Code: public class Picture extends JComponent
implements MouseListener, FocusListener, Accessible {
private static final long serialVersionUID = -5579041754578833061L;
Image image;
String name;
/**
* @param image
* @param name
*/
public Picture(Image image, String name) {
this.image = image;
this.name = name;
setFocusable(true);
addMouseListener(this);
addFocusListener(this);
}
/* (non-Javadoc)
* @see java.awt.Component#getName()
*/
public String getName() {
return name;
}
/* (non-Javadoc)
* @see java.awt.Component#setName(java.lang.String)
*/
public void setName(String name) {
this.name = name;
}
Code: public class DTPicture extends Picture implements MouseMotionListener {
private static final long serialVersionUID = -7565390812902798045L;
private MouseEvent firstMouseEvent = null;
/**
* @param image
* @param name
*/
public DTPicture(Image image, String name) {
super(image, name);
addMouseMotionListener(this);
}
/**
* @param image
*/
public void setImage(Image image) {
this.image = image;
this.repaint();
}
/* (non-Javadoc)
* @see java.awt.Component#setName(java.lang.String)
*/
public void setName(String name) {
this.name = name;
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*
* Wenn das Bild mit der Maus angeklickt wird, nicht draggen, wenn kein image vorhanden
*/
public void mousePressed(MouseEvent me) {
if (image == null)
return;
firstMouseEvent = me;
me.consume();
}
/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent md) {
if (image == null) //nicht draggen, wenn die Komponente kein image aufweist
return;
if (firstMouseEvent != null) {
md.consume();
int ctrlMask = InputEvent.CTRL_DOWN_MASK;
int action = ((md.getModifiersEx() & ctrlMask ) == ctrlMask) ? TransferHandler.COPY : TransferHandler.MOVE;
int dx = Math.abs(md.getX() - firstMouseEvent.getX());
int dy = Math.abs(md.getY() - firstMouseEvent.getY());
if (dx > 5 || dy > 5) { //5 Pixel ist der Beginn von drag
JComponent c = (JComponent)md.getSource(); //das ist ein drag, kein klick
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, firstMouseEvent, action);
firstMouseEvent = null;
}
}
}
/**
* @param mr
*/
public void MouseReleased(MouseEvent mr) {
firstMouseEvent = null;
}
/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved(MouseEvent arg0) {
}
}
Code: class PictureTransferHandler extends TransferHandler {
private static final long serialVersionUID = 3520414919616717936L;
/**
* Datenaustausch für image und name
*/
DataFlavor pictureFlavor = DataFlavor.imageFlavor;
DataFlavor nameFlavor = DataFlavor.stringFlavor;
DTPicture sourcePic;
boolean shouldRemove;
/* (non-Javadoc)
* @see javax.swing.TransferHandler#importData(javax.swing.JComponent, java.awt.datatransfer.Transferable)
*/
public boolean importData(JComponent c, Transferable t) {
Image image;
String name = null;
if (canImport(c, t.getTransferDataFlavors())) {
DTPicture pic = (DTPicture)c;
if (sourcePic == pic) { //nicht auf mir selber droppen
shouldRemove = false;
System.out.println("source Pic == pic");
return true;
}
if (pic.name != null) { //wenn schon ein image am Platz liegt, ist droppen nicht mehr erlaubt
shouldRemove = false;
return true;
}
try {
image = (Image)t.getTransferData(pictureFlavor);
name = (String)t.getTransferData(nameFlavor);
//Component auf das neue Picture setzen
pic.setImage(image);
pic.setName(name);
return true;
} catch (UnsupportedFlavorException ufe) {
System.out.println("importData: unsupported data flavor");
} catch (IOException ioe) {
System.out.println("importData: I/O exception");
}
}
return false;
}
/* (non-Javadoc)
* @see javax.swing.TransferHandler#createTransferable(javax.swing.JComponent)
*/
protected Transferable createTransferable (JComponent c) {
sourcePic = (DTPicture)c;
shouldRemove = true;
return new PictureTransferable(sourcePic);
}
/* (non-Javadoc)
* @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent)
*/
public int getSourceActions(JComponent c) {
return MOVE;
}
/* (non-Javadoc)
* @see javax.swing.TransferHandler#exportDone(javax.swing.JComponent, java.awt.datatransfer.Transferable, int)
*/
protected void exportDone(JComponent c, Transferable data, int action) {
if (shouldRemove && (action == MOVE)) {
sourcePic.setImage(null);
sourcePic.name = null;
}
sourcePic = null;
}
/* (non-Javadoc)
* @see javax.swing.TransferHandler#canImport(javax.swing.JComponent, java.awt.datatransfer.DataFlavor[])
*/
public boolean canImport(JComponent c, DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (pictureFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
/**
* @author
*
*/
class PictureTransferable implements Transferable {
private Image image;
private String name;
/**
* @param pic
*/
PictureTransferable(DTPicture pic) {
image = pic.image;
name = pic.name;
}
/* (non-Javadoc)
* @see java.awt.datatransfer.Transferable#getTransferData(java.awt.datatransfer.DataFlavor)
*/
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (flavor.equals(pictureFlavor)) {
return image;
}
else if (flavor.equals(nameFlavor)) {
return name;
}
else throw new UnsupportedFlavorException(flavor);
}
/* (non-Javadoc)
* @see java.awt.datatransfer.Transferable#getTransferDataFlavors()
*/
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { pictureFlavor, nameFlavor };
}
/* (non-Javadoc)
* @see java.awt.datatransfer.Transferable#isDataFlavorSupported(java.awt.datatransfer.DataFlavor)
*/
public boolean isDataFlavorSupported(DataFlavor flavor) {
return pictureFlavor.equals(flavor) || nameFlavor.equals(flavor);
}
}
}
|
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Images in JFrames | am82 | Desktop-Applikationen und Grafik | 9 | 02.12.2005 12:16 |
| Drag and Drop? | Java17 | Desktop-Applikationen und Grafik | 15 | 05.05.2005 10:59 |