2014-03-28 93 views
0

所以我想實現一個鼠標監聽器到我的程序中,我得到了mouseListener工作,但不是圖形。我試圖找到一種方法來繪製一個藍色的圓圈,每次鼠標點擊JPANEL時,唯一的問題是我似乎無法得到一個良好的圖形調用(我試圖命名g)。Java MouseListener圖形實現

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 



class moveItMon extends JPanel implements MouseListener{ 

    public moveItMon() { 
     this.setPreferredSize(new Dimension(500, 500)); 
     addMouseListener(this); 
    } 

    public void addNotify() { 
     super.addNotify(); 
     requestFocus(); 
    } 

    public void mouseClicked(MouseEvent e){} 
    public void mouseExited(MouseEvent e){} 
    public void mouseEntered(MouseEvent e){} 
    public void mousePressed(MouseEvent e){} 
    public void mouseReleased(MouseEvent e) { 
     movetehMon(e); 
    } 

    public void movetehMon(MouseEvent e){ 
     int x = e.getX(); 
     int y = e.getY(); 
     System.out.println("(" + x + "," + y + ")"); 
     paintMon(x,y); 
    } 
    public void paintMon(int x, int y){ 
     Graphics g = new Graphics(); 
     g.setColor(Color.WHITE); 
     g.clearRect(0,0,500,500); 
     g.setColor(Color.BLUE); 
     g.fillOval(x,y,20,20); 
    } 

    public static void main(String[] s) { 
     JFrame f = new JFrame("moveItMon"); 
     f.getContentPane().add(new moveItMon()); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 


} 
+0

只是一個提示,根據java代碼約定類名應該以大寫字母開頭 – Templar

回答

1

Graphics g = new Graphics();是行不通的(我敢肯定,你知道)作爲類是抽象的。

在Swing定製繪畫是通過覆蓋從JComponent延伸的部件(像JPanel)的paintComponent和使用所提供的上下文Graphics要繪製的完成。

看看Performing Custom PaintingPainting in AWT and Swing更多細節

你也應該提防的是繪畫是一個破壞性的過程,這意味着每次paintComponent被調用時,我們希望你更新你需要畫的一切。

+0

再次感謝。還有一個問題可能聽起來很愚蠢,是否有一種方法可以實現一個不會使用圖形組件更改的圖形(我希望將其用作點擊框)? – Kemosabe

+1

至少有兩種方法可以實現它。首先是存儲你在某種'List'中生成的每個形狀,並且每次調用'paintComponent'時迭代這個列表。這需要存儲關於顏色和其他屬性以及形狀的信息。另一種是使用'BufferedImage'作爲主要畫布,直接​​繪製這個畫布,當調用'paintComponent'時,將圖像繪製到'Graphics'上下文中 – MadProgrammer