Frage

Ich versuche, ein Applet zu machen, die ich einfach ein Bild ziehen. Und ich möchte, Bildobjekt Ereignisse zu hören. Also hier ist der Applet-Code, der einfach läuft in einem Thread:

import java.awt.*;
import java.net.URL;
import javax.swing.JApplet;

public class Client extends JApplet implements Runnable {
    private static final long serialVersionUID = 1L;
    MediaTracker mediaTracker;
    Image [] imgArray;
    Tas t1;

    public void init() 
    { 
        mediaTracker = new MediaTracker(this);
        imgArray = new Image[1];

        URL base = getCodeBase(); 
        imgArray[0] = getImage(base,"okey.png");
        mediaTracker.addImage(imgArray[0],1);

        try {
            mediaTracker.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t1 = new Tas(this, new Rectangle(0, 0, imgArray[0].getWidth(this), imgArray[0].getHeight(this)), imgArray[0]);

        Thread t = new Thread(this);
        t.start();
    }

    public void paint(Graphics g) 
    {
        t1.paint(g);
    }

    @Override
    public void run() {
        while(true){
            //System.out.println("run");
            repaint();
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Und die Klasse von Objekt, das Bild hält, ist:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Movable extends JPanel implements MouseListener {

public Client mainObj;
public Rectangle rect;
public Image image;

public Movable(Client mainObj, Rectangle rect, Image image) {
    this.mainObj = mainObj;
    this.rect = rect;
    this.image = image;
    addMouseListener(this);
}

public void paint(Graphics g) {
    g.drawImage(image, rect.x, rect.y, rect.width, rect.height, this);
}

@Override
public void mouseClicked(MouseEvent arg0) {
    System.out.println("clicked");
}

@Override
public void mouseEntered(MouseEvent arg0) {

}

@Override
public void mouseExited(MouseEvent arg0) {

}

@Override
public void mousePressed(MouseEvent arg0) {
    System.out.println("pressed");
}

@Override
public void mouseReleased(MouseEvent arg0) {

}
}

@SuppressWarnings("serial")
class Tas extends Movable{
    public String name = "";

    public Tas(Client mainObj, Rectangle rect, Image image) {
        super(mainObj, rect, image);
    }


}

kann ich das Bild in meinem Applet sehen, aber es passiert nichts, wenn ich in dem oder aus dem Bild klicken. Also, was mit diesem Code falsch ist.

War es hilfreich?

Lösung

Unter der Annahme, dass Tas in Code # 1 in Code # Verschiebbare 2 ...

Sie eigentlich nicht die Verschiebbare als Komponente verwenden, aber es stattdessen fragen sich malen auf den Grafikkontext des Applet, hier:

public void paint(Graphics g) 
{
    t1.paint(g);
}

Stattdessen sollten Sie eine Instanz von mobilem auf den Behälter Applet hinzuzufügen, wobei Malerei Automatik aktiviert wird, und es beginnt Maus-Ereignisse zu empfangen. Sie können auch diese Methode paint () entfernen Sie dann auch.

Andere Tipps

Zu allererst sollten Sie nie die Farbe Methode eines Top-Level-Container (JApplet, JFrame, JDialog) außer Kraft setzen.

Dann benutzerdefinierte Malerei auf anderen Swing-Komponenten zu tun, Sie die paintcomponent () -Methode der Komponente außer Kraft setzen, nicht die Farbe () -Methode. Lesen Sie die Swing-Tutorial auf Benutzerdefinierte Gemälde . Also zuerst diese Probleme beheben.

Ich bin mir nicht sicher, was der Punkt des Themas, aber es aus dem Code zu entfernen, bis Sie Ihre anderen Probleme lösen. Wenn Sie versuchen, Animation zu tun, dann sollten Sie verwenden ein Swing-Timer , kein Thema.

Wenn Sie einen Code sehen wollen für Komponenten Ziehen Sie einen Blick auf Umzug von Windows für einige generischen Code.

Dies ist eine Arbeitslösung. Es ist nicht ein Applet aber Sie können das leicht umwandeln. Hoffe, es hilft:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ImagePanel extends JPanel {

    Image image;
    Point2D axis = new Point2D.Double();
    boolean drag = false;
    Point2D dragPoint = new Point2D.Double();

    public ImagePanel(Image image) {
        this.image = image;
        setPreferredSize(new Dimension(300,300));
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                drag = true;
                dragPoint = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                drag = false;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (drag) {
                    axis.setLocation(axis.getX()
                            + (e.getPoint().x - dragPoint.getX()), axis.getY()
                            + (e.getPoint().y - dragPoint.getY()));
                    dragPoint = e.getPoint();
                    repaint();
                }
            }
        });
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(image, (int) axis.getX(), (int) axis.getY(), null);
    }

    public static void main(String[] args) {
        try {
            JFrame f = new JFrame();
            f.getContentPane().add(
                    new ImagePanel(ImageIO.read(new File("image.jpg"))));
            f.pack();
            f.setVisible(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Die einfache Antwort ist -. Sie haben keinen Code etwas in mouse () oder mouse zu tun ()

Es gibt viele andere Probleme im Code aber ...

Einfachste Lösung, die ich tun konnte, -

public class Client extends JApplet {

private MouseInputAdapter myMouseListener = new MyMouseListener();

public void init() {
    // usually a very bad idea, but needed here 
    // since you want to move things around manually
    setLayout(null);

    // assuming this will get used often, so making it a method.
    addLabelForImage(getImage(getCodeBase(), "okay.png"));
}

private void addLabelForImage(Image image) {
    ImageIcon icon = new ImageIcon(image);
    JLabel l = new JLabel(icon);
    add(l);
    l.setSize(l.getPreferredSize());
    // you'll probably want some way to calculate initial position 
    // of each label based on number of images, size of images, 
    // size of applet, etc. - just defaulting to 100,100 now.
    l.setLocation(100, 100);
    l.addMouseListener(myMouseListener);
    l.addMouseMotionListener(myMouseListener);
}

// Made this a MouseInputAdapter because I assume you may want to handle
// other types of mouse events later...
private static class MyMouseListener extends MouseInputAdapter {
    @Override
    public void mouseDragged(MouseEvent e) {
        // when the mouse is dragged over a the component this listener is
        // attached to (ie - one of the labels) convert the point of the mouse
        // event from the internal component coordinates (0,0 is upper right 
        // corner of each label), to it's parent's coordinates (0,0 is upper
        // right corner of the applet), and set the components location to 
        // that point.
        Component theLabel = e.getComponent();
        Container theApplet = theLabel.getParent();
        Point labelPoint = e.getPoint();
        Point appletPoint = SwingUtilities.convertPoint(
                theLabel, labelPoint, theApplet );
        theLabel.setLocation(appletPoint);
    }
}

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top