2013-08-07 93 views
-2

我一直在YouTube上觀看關於如何使用MouceListeners的視頻,以及它在視頻上的工作情況,但是在我的電腦上看不到。這裏是代碼 包小程序;爲什麼這個Applet不能正常工作

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

    public class MouseListenerTut 
    extends Applet 
    implements MouseListener{ 


private Graphics GG = null; 


private void Init(){ 
    this.addMouseListener(this); 


} 

private int Mx; 
private int My; 


public void paint(Graphics g){ 


    GG = g.create(); 

    this.setSize(new Dimension(800,600)); 

} 


public void DrawDot(int x, int y){ 

    int r = (int) (Math.random() * 255); 
    int g = (int) (Math.random() * 255); 
    int b = (int) (Math.random() * 255); 

    Color Col = new Color(r,g,b); 
    GG.setColor(Col); 
    GG.fillOval(x, y, 10, 10); 
} 


@Override 
public void mouseClicked(MouseEvent e) { 
    Mx = e.getX(); 
    My = e.getY(); 

    DrawDot(Mx,My); 
} 


@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 






    } 

我真的不明白爲什麼它不會工作,它不顯示任何錯誤,它縫合完美地爲他工作......

+0

你必須更具體。 '不工作'是什麼意思? – Undefined

回答

1

g.create()返回圖形的副本對象,所以你正在修改一個副本,而不是繪製的東西。即使你沒有通過一個副本,你會修改圖形對象後,它已被繪製。

你應該真的修改你的paint()方法中的g,然後在點擊鼠標時調用repaint(),就像這樣;

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

public class MouseListenerTut 
extends Applet 
implements MouseListener{ 

    private void Init(){ 
     this.addMouseListener(this); 
     this.setSize(new Dimension(800,600)); 
    } 

    private int Mx=0, My=0; 
    private Color Mc = Color.WHITE; 

    public void paint(Graphics g){ 
     g.setColor(Mc); 
     g.fillOval(Mx, My, 10, 10); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     Mx = e.getX(); 
     My = e.getY(); 
     int r = (int) (Math.random() * 255); 
     int g = (int) (Math.random() * 255); 
     int b = (int) (Math.random() * 255); 
     Mc = new Color(r,g,b); 
      repaint(); 
    } 

    //Spare Listeners 
    @Override 
    public void mouseEntered(MouseEvent arg0) {} 
    @Override 
    public void mouseExited(MouseEvent arg0) {} 
    @Override 
    public void mousePressed(MouseEvent arg0) {} 
    @Override 
    public void mouseReleased(MouseEvent arg0) {} 
} 
1

您正在繪製到已退出的圖形。使用BufferedImage跟蹤所有圖紙。

使用這種塗料的方法:

public void paint(Graphics g) 
{ 
    g.drawImage(buffer, 0, 0, null); 
} 

使用此方法的mouseClicked:

public void DrawDot(int x, int y) 
{ 
    int r = (int) (Math.random() * 255); 
    int g = (int) (Math.random() * 255); 
    int b = (int) (Math.random() * 255); 

    Graphics g = buffer.createGraphics(); 
    Color Col = new Color(r,g,b); 
    g.setColor(Col); 
    g.fillOval(x, y, 10, 10); 
    g.dispose(); 

    repaint(); // make sure you show your edits on screen 
} 

最後要確保你有一個buffer對象。把它放在你的課堂上:

private BufferedImage buffer = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGBA_PRE); 
+1

我對'Applet's不是很熟悉,但是使用'JFrame',只有當JFrame被移出屏幕或重新調整大小時才調用paint()。不用在鼠標上調用'repaint()',你的方法可能永遠不會比原始的'BufferedImage'繪製更多。 – Robadob

+0

是的,你說得對。我會添加到我的答案。 –

相關問題