Domanda

Sto cercando di fare un applet che posso semplicemente trascinare un'immagine. E voglio oggetto immagine per ascoltare gli eventi. Quindi, ecco il codice applet che semplice corsa in un 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();
            }
        }
    }
}

E la classe dell'oggetto che contiene immagine è:

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);
    }


}

Posso vedere l'immagine nella mia applet ma non succede nulla quando si fa clic dentro o fuori l'immagine. Allora, cosa c'è di sbagliato in questo codice.

È stato utile?

Soluzione

Supponendo che Tas nel codice # 1 è mobile nel codice # 2 ...

In realtà non utilizza il mobile come un componente, ma invece chiedere di pittura stessa sul contesto grafico del Applet, qui:

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

Invece si dovrebbe aggiungere un'istanza di mobile sul contenitore del Applet, in cui la pittura diventerà automatico, e si inizierà a ricevere eventi del mouse. È inoltre possibile rimuovere che il metodo paint () anche allora.

Altri suggerimenti

Prima di tutto si dovrebbe mai ignorare il metodo paint di un contenitore di livello superiore (JApplet, JFrame, JDialog).

Poi, per fare di verniciatura personalizzata su altri componenti Swing si override del metodo paintComponent () del metodo, non la vernice () componente. Leggi il tutorial Swing on personalizzato pittura . Quindi, prima risolvere questi problemi.

Non sono sicuro di quale sia il punto della discussione è, ma rimuoverlo dal codice fino a risolvere i vostri problemi di altri. Se si sta cercando di fare animazione, allora si dovrebbe essere utilizzando un altalena Timer , non un filo.

Se volete vedere qualche codice per trascinare i componenti si può dare un'occhiata a Moving di Windows per qualche codice generico.

Si tratta di una soluzione di lavoro. Non è un applet ma si può facilmente convertire tale. Speranza che aiuta:

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();
        }
    }

}

La risposta è semplice -. Non si dispone di codice per fare qualsiasi cosa in mousePressed () o mouseReleased ()

Ci sono un sacco di altri problemi nel codice anche se ...

soluzione più semplice potevo venire con -

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);
    }
}

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top