2012-08-25 81 views
0

我正在嘗試創建一個繪製一個圓圈(定義爲對象)到屏幕的小程序,然後可以使用鼠標在屏幕上拖動此圓圈。到目前爲止,當鼠標被按下時,對象被繪製並且可以被拖動,但是我想要的是在applet被啓動時繪製對象,然後允許用戶點擊對象並拖動它。任何幫助或線索將不勝感激。這裏是代碼:使用MouseListener拖動對象Java applet

import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 

public class sheepDog extends Applet implements ActionListener, MouseListener, MouseMotionListener 
{ 
    manAndDog dog; 
    int xposR; 
    int yposR; 

    public void init() 
    { 
     addMouseListener(this); 
     addMouseMotionListener(this); 

    } 
    public void paint(Graphics g) 
    { 
     dog.display(g); 

    } 
    public void actionPerformed(ActionEvent ev) 
    {} 
    public void mousePressed(MouseEvent e) 
    { 

    } 
    public void mouseReleased(MouseEvent e) 
    { 


    } 
    public void mouseEntered(MouseEvent e) 
    {} 
    public void mouseExited(MouseEvent e) 
    {} 
    public void mouseMoved(MouseEvent e) 
    { 
    } 
    public void mouseClicked(MouseEvent e) 
    {} 
    public void mouseDragged(MouseEvent e) 
    { 
     dog = new manAndDog(xposR, yposR); 
     xposR = e.getX(); 
     yposR = e.getY(); 
     repaint(); 

    } 
} 

class manAndDog implements MouseListener, MouseMotionListener 
{ 
    int xpos; 
    int ypos; 
    int circleWidth = 30; 
    int circleHeight = 30; 
    Boolean mouseClick; 

    public manAndDog(int x, int y) 
    { 
     xpos = x; 
     ypos = y; 
     mouseClick = true; 
     if (!mouseClick){ 
      xpos = 50; 
      ypos = 50; 
     } 

    } 

    public void display(Graphics g) 
    { 
     g.setColor(Color.blue); 
     g.fillOval(xpos, ypos, circleWidth, circleHeight); 
    } 

    public void mousePressed(MouseEvent e) 
    { 
     mouseClick = true; 
    } 
    public void mouseReleased(MouseEvent e) 
    { 

    } 
    public void mouseEntered(MouseEvent e) 
    {} 
    public void mouseExited(MouseEvent e) 
    {} 
    public void mouseMoved(MouseEvent e) 
    {} 
    public void mouseClicked(MouseEvent e) 
    {} 
    public void mouseDragged(MouseEvent e) 
    { 
     if (mouseClick){ 
      xpos = e.getX(); 
      ypos = e.getY(); 
     } 


    } 
} 

感謝

+1

1)請學會共同[Java命名約定(http://java.sun.com/docs /books/jls/second_edition/html/names.doc.html#73307)(特別是用於名稱的情況),用於類,方法和屬性名稱並一致使用它。 2)如果老師沒有指定一個框架的'小程序'代碼。如果他們確實指定了一個小程序,告訴他們他們不適合教導,並且應該爲自己感到羞恥。 –

+0

public void mouseDragged(MouseEvent e) dog = new manAndDog(xposR,yposR);'更好的設計是隻創建和屏幕上出現的manAndDog一樣多的實例(例如1)獲取/設置x,y位置的方法。 –

+0

@AndrewThompson +1羞辱教師:) – MadProgrammer

回答

1

在你的applet的start方法,指定一個位置爲manAndDog對象,然後調用repaint

Reimeus更正確,init方法是一種較好的讓男人和狗活躍起來的地方。

希望你不介意一些反饋;)

  1. 你應該在你paint方法調用super.paint(g)。事實上,我鼓勵你使用JApplet並覆蓋paintComponent,但這只是我
  2. 我沒有看到需要不斷重新創建manAndDog對象。

例如。如果您添加了方法setLocation,則可以在拖動鼠標時簡單地調用「setLocation」。

public void mouseDragged(MouseEvent e) { 
    dog.setLocation(xposR, yposR); 
    xposR = e.getX(); 
    yposR = e.getY(); 
    repaint(); 
} 

這樣效率更高,因爲它不會持續創建短暫的對象。這也意味着您可以使用manAndDog對象進行更多操作,例如應用動畫。恕我直言

1

最簡單的方法是在你的init()方法來創建ManAndDog對象,像:

dog = new ManAndDog(0, 0); 
+0

+1使用'init'而不是'start',這是個好主意;) – MadProgrammer