2015-12-17 66 views
0

以下是我有什麼,我有一個的paintComponent方法在一個類中,如何使paintComponent跟隨鼠標?

public void paintComponent(Graphics g) { 
     g2.setPaint(Color.red); 
     g2.fillRect(100, 100, 50, 50); 
} 

我要作出這樣的圖形對象(上)跟隨我的鼠標在第二類,但我不知道該怎麼在我的第二堂課中調用它(下面),我寫了第一堂課的構造函數,但我不知道如何讓它顯示在我的框架中。附: 我和MouseMotionListener添加到我的框架

public void mouseMoved(MouseEvent e) { 
    GOLDraw g1 = new GOLDraw();//default constructor from the first class 
    repaint(); 
} 

請就如何調用的paintComponent方法深入淺出的講解,爲什麼(我會嘗試去了解它,我不知道很多關於繼承和這樣)。可能是因爲我是初學者,而且我做錯了,讀完api和google幾小時後我什麼都沒發現。

public class GolPresets extends JComponent implements MouseMotionListener{ 


    public GolPresets() { 

    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 

    } 

    Point point; 
    @Override 
    public void mouseMoved(MouseEvent e){ 
     point = e.getPoint(); 
    } 


    public void paintComponent(Graphics g) { 
      g.drawRect(point.x, point.y, 100, 100); 
    } 

    public void GUI() { 
     JFrame frame = new JFrame(""); 
     frame.setVisible(true); 
     frame.setSize(500, 500); 
     frame.add(new GolPresets()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new GolPresets()); 
     frame.addMouseMotionListener(this); 

    } 

    public static void main(String[] args) { 
     GolPresets g = new GolPresets(); 
     g.GUI(); 
    } 

} 
+1

調用'repaint'將安排在事件調度線程,一個「畫」事件,將通過一系列額外的方法調用,調用你的'paintComponent'方法。請參閱[在AWT和Swing中繪畫](http://www.oracle.com/technetwork/java/painting-140037.html)和[執行自定義繪畫](http://docs.oracle.com/javase/tutorial/) uiswing/painting /)獲取關於繪畫的工作原理的更多細節 – MadProgrammer

+0

以下是如何使組件可拖動的方法:http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/drag/Draggable.java – ControlAltDel

+1

所以遠非如此,你提供了一堆無關聯的代碼,它沒有提供任何關於你在做什麼或者如何產生問題的線索。考慮提供一個[可運行的示例](https://stackoverflow.com/help/mcve),它可以證明你的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的困惑和更好的迴應 – MadProgrammer

回答

0

那麼共享狀態在哪裏存在?您需要跟蹤mouseMoved方法中的光標位置;你應該重新使用已經創建的組件(不是每次都新建一個組件)並調用repaint()方法。

+0

對不起,我不明白你的意思是共享狀態。我知道我需要跟蹤鼠標位置並繪製鼠標所在的位置,但我不知道如何調用paintComponent方法,這就是問題所在。 – Mike

+0

一般而言,共享狀態是在兩個或多個組件(通常是Java中的類)之間共享的可變狀態(字段,變量,對象,無論)。在你的情況下,你的共享狀態是什麼?鼠標的位置。鑑於方法'paintComponent'的簽名是由Swing固定和禁止的,您將無法將其作爲參數傳遞。訪問該信息的其他方法是通過其他類中的公共靜態字段(大禁止)或來自正在繪製的組件中的一個或多個字段。 –

+0

我用了一個Point變量,並且在編輯後,在我的paintComponent中,我做了g2.fillRect(point.x,point.y,50,50);但它仍然因爲某種原因不起作用。 – Mike

1

例如:

Point lastCursorPoint; 

public void mouseMoved(MouseEvent e) { 
    lastCursorPoint = e.getPoint(); 
    repaint(); 
} 

public void paintComponent(Graphics g) { 
    if (lastCursorPoint != null) { 
     g2.setPaint(Color.red); 
     g2.fillRect(lastCursorPoint.x, lastCursorPoint.y, 50, 50); 
    } 
} 
0

下面是一個例子:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

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

public class MouseFollower extends JPanel { 

    protected Point spot; 

    public MouseFollower() { 
     final MouseFollower me = this; 
     addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      spot = e.getPoint(); 
      repaint(); 
     } 
     }); 

     addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseExited(MouseEvent e) { 
      spot = null; 
      repaint(); 
     } 
     }); 

     setPreferredSize(new Dimension(300, 300)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (spot != null) { 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setColor(Color.red); 
     g2.fillRect(spot.x, spot.y, 50, 50); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame win = new JFrame("MouseFollower"); 
      final MouseFollower mf = new MouseFollower(); 
      win.add(mf); 
      win.pack(); 
      win.addWindowListener(new WindowAdapter() { 
       @Override 
       public void windowClosing(WindowEvent arg0) { 
        System.exit(0); 
       } 
      }); 

      win.setVisible(true); 
     } 
     }); 
    } 
}