PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Applet, Drag n Drop einer Instanz



Geist
16-02-2005, 12:22
Hallo liebe Gemeinde,

ich habe ein Problem und hoffe Ihr könnt helfen:
Ich arbeite gerade an einem Applet, welches mehrere Objekte (zusammengesetzt aus Bild und Text, noch nicht umgesetzt) beinhaltet. Für jedes Objekt habe ich eine neue Klasse erstellt und hole mir dann im Applet die Instanz dieser Klasse. Soweit so gut. Jetzt würde ich gern die Instanz per Drag and Drop auf dem Bildschirm verschieben. Probiert habe ich das im Vorfeld mit dem Bild (suseMatti), welches im Applet geladen wird. Das funzt auch. Leider habe ich keine Vorstellung davon, wie ich die Instanz (bzw. das Objekt) dazu bringe auf meinen Drag and Drop zu reagieren, denn für einen DnD braucht man einen repaint(), den bekomme ich aber nur in dem Applet.


Hier das Applet (eingang.java):
------------------------------------------------
import java.awt.*;
import java.awt.MediaTracker;
import java.awt.event.*;

public class eingang extends java.applet.Applet implements Runnable {

private int iSMx;
private int iSMy;
private int iSMbreite=0;
private Image bgBild;
private Graphics gBild;
private Thread t1=null;
private Email emailButton;
private int imailButtonX_alt;
private int imailButtonY_alt;
private Image imgSM;
private int ok = 0;
private String sDnD=null;
private Toolkit tk = getToolkit();

public void init() {
resize(900,500);
emailButton = new Email();

bgBild = createImage(getWidth(),getHeight());
gBild = bgBild.getGraphics(); //hole die Graphics Funktionen in das Image Objekt
iSMx = getWidth() / 2;
iSMy = getHeight() / 2;

MediaTracker mt = new MediaTracker(this);
imgSM = getImage( getCodeBase(),"pics/suseMatti.gif" );
mt.addImage(imgSM,0);

try{
mt.waitForAll();
}catch(InterruptedException ie){
showStatus("suseMatti nicht gefunden");
}
}

public void paint(Graphics g){
gBild.setColor(Color.BLACK);
gBild.setFont( new Font("Arial,Helvetica", Font.BOLD, 30) );
gBild.drawString("Hallo Besucher",50,50);
gBild.drawImage(imgSM,iSMx,iSMy,iSMbreite,iSMbreit e,this);
emailButton.myPaint(gBild);
g.drawImage(bgBild,0,0,this);

}

public void update(Graphics g){
Color ctmp = gBild.getColor();
gBild.setColor(getBackground());
gBild.fillRect(0,0,getWidth(),getHeight());
gBild.setColor(ctmp);

paint(g);
}


public void start() {
if(t1==null){
t1 = new Thread(this);
t1.start();
}
}

public void stop(){
t1=null;
}

public void run(){
while(true){
try{
if( iSMbreite < 420 ){
iSMbreite+=4;
iSMx-=2;
iSMy-=2;
repaint();
}
Thread.sleep(15);
}catch(InterruptedException e){
stop();
}
}

}


public boolean mouseDown(Event e, int x, int y){
sDnD = emailButton.myMouseDown(e,x,y);
showStatus( sDnD );
return true;
}

public boolean mouseUp(Event e, int x, int y){
sDnD = emailButton.myMouseUp();
repaint();
return true;
}

public boolean mouseDrag(Event e, int x, int y){
//if( sDnD.equals("Anfasser Email") ){
//emailButton.myPaint(gBild);
//}
repaint();
return true;

}

}
----------------------------------------------------------
Hier die Klasse Email:
----------------------------------------------------------


import java.awt.*;
import java.lang.*;

public class Email extends java.applet.Applet{

int posX;
int posX_alt;
int posY;
int posY_alt;
int iAnfasser=56;
int iAnfasserHoehe=10;
int iLogo=55;
int iText=55;
String sRueckgabe=null;




protected void myPaint(Graphics g){
posX = 50;
posY = 50;
g.setColor(new Color( 200,200,200 ) );
g.fillRect( posX,posY,iAnfasser,iAnfasserHoehe );
//g.drawRect( posX,posY+10,iLogo,50 );
//g.drawRect( posX+55,posY,iText,60 );


}

protected void myPaint(Graphics g, int posX, int posY){
g.setColor(new Color( 200,200,200 ) );
g.fillRect( posX,posY,iAnfasser,iAnfasserHoehe );
//g.drawRect( posX,posY+10,iLogo,50 );
//g.drawRect( posX+55,posY,iText,60 );

}


public String myMouseDown(Event e, int x, int y){
if(x <= posX+iAnfasser && x >= posX && y <= posY+iAnfasserHoehe && y >= posY){
sRueckgabe = "Anfasser Email";
posX_alt = x-iAnfasser;
posY_alt = y-iAnfasserHoehe;
}
return sRueckgabe;
//return true;
}

public String myMouseUp(){
sRueckgabe = "";
return sRueckgabe;
}

public void myMouseDrag(Event e, int x, int y){
if(sRueckgabe.equals("Anfasser Email") ){
posX = x-posX_alt;
posY = y-posY_alt;
}

}
}
--------------------------------------------------

Ich habe nun versucht innerhalb der Klasse Email die X und Y Positionen zu verändern und zwar in dem Moment, wenn ich den MouseDown ausführe. Dann versuche ich nach dem Verändern einen repaint() des Applets auszuführen, leider erfolglos.

Kann ich aus einer untergeordneten Klasse das übergeordnete Applet anweisen einen repaint() auszuführen? Wie geht das? Kann ich mir das darüberliegende Objekt irgendwie einlesen und dann ansprechen?

Ich hoffe ich konnte das Problem verständlich machen und hoffe noch mehr, dass jemand helfen kann. Ich könnte natürlich auf die verschiedenen Klassen verzichten und alle 'Objekte' in das Applet klatschen, aber das ist ja nicht Sinn einer Objektorientierten Programmiersprache.


Ich danke Euch schonmal im voraus!

Geist
16-02-2005, 13:48
Hat sich erledigt! Ich habe seit 3 Std. übersehen, dass ich in myPaint der Email-Klasse x und y wieder auf 50 setze *heul*.

... und nur weil ich auf dem Sofa progammiert habe. Jetzt sitze ich am Rechner und habe es in 5 Minuten gefunden. Das blöde Notebook taucht doch nur zum surfen.