2015-10-04 69 views
1

可見JComponents我試圖代碼,主要是用於以示範一個簡單的Java應用程序,但它不會出於某種原因。它的主要功能是基本跟蹤鼠標的移動,並在鼠標所在的位置繪製一個框。我一直在研究一些代碼,這就是我所擁有的。難道我做錯了什麼?圖紙上的MouseEvent

這是主類

package peter; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.MouseInfo; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

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

public class Frame extends JPanel implements MouseMotionListener { 

    private final static JFrame window = new JFrame(); 

    public Frame(){ 
     addMouseMotionListener(this); 
     setPreferredSize(new Dimension(450, 450)); 
     setBackground(Color.GREEN); 
    } 

    private static int mouseX; 
    private static int mouseY; 
    public static void main(String[] args){ 
     //Create and set up the window. 
     JFrame frame = new JFrame("MouseMotionEventDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     JComponent newContentPane = new Frame(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    @Override 
    public void mouseDragged(MouseEvent e) 
    { 
     ; 
    } 
    @Override 
    public void mouseMoved(MouseEvent e) 
    { 
     JComponent P = new Paintings(); 
     window.add(P); 
     System.out.println("Mouse moved"); 
    } 

    public static int getMouseY() 
    { 
     return MouseInfo.getPointerInfo().getLocation().y; 
    } 
    public static int getMouseX() 
    { 
     return MouseInfo.getPointerInfo().getLocation().x; 
    } 

    public static Rectangle rectOnMouse() 
    { 
     Rectangle rect = new Rectangle(getMouseX(), getMouseY(), 10,10);  
     return rect; 
    } 
} 

這是繪畫類

package peter; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JComponent; 

public class Paintings extends JComponent{ 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.draw(Frame.rectOnMouse()); 
    } 
} 
+0

你的 'getMouseX()' 將返回 'Y'。 – leeor

+0

我更新了代碼以解決此問題。感謝您的輸入 –

+0

在您做出大量不正確的假設時閱讀教程。對於你重複創作和添加繪畫對象是錯誤的。爲什麼要重複組件? –

回答

4

你不想讓你的MouseMotionListener中添加組件。只需改變一個矩形的位置並繪製它。此外,您想要將MouseListener或MouseMotionListener添加到繪圖組件,否則您的鼠標點可能會關閉。例如:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class SimpleDraw extends JPanel { 
    private static final int PREF_W = 450; 
    private static final int PREF_H = PREF_W; 
    private static final Dimension RECT_DIM = new Dimension(10, 10); 
    private Rectangle rect = null; 

    public SimpleDraw() { 
     addMouseMotionListener(new MyMouse()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     if (rect != null) { 
      g2.draw(rect); 
     } 
    } 

    // so this JPanel's is sized correctly 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouse extends MouseAdapter { 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      // simply change the Rectangle 
      rect = new Rectangle(e.getPoint(), RECT_DIM); 
      repaint(); // and have the JVM re-paint this JPanel 
     } 
    } 

    private static void createAndShowGui() { 
     SimpleDraw mainPanel = new SimpleDraw(); 

     JFrame frame = new JFrame("SimpleDraw"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     // initialize our GUI on the Swing event thread 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

更多關於擺動拉絲:

與您的代碼的其他問題高級教程:

  • 你會想避免讓你的視圖類,例如框架,實現你的監聽器接口,因爲它可能會變得混亂,並且不能很好地擴展。
  • 你過分依賴靜態方法太多了,做這個鬆散的OOP的優勢,主要是面向對象的,以幫助減少複雜問題的能力。
  • 同樣你的mouseMoved方法創建新的繪畫作品組成部分,不斷增加他們到JFrame。這不僅是不必要的,它是有害的,因爲新組件將成爲資源和內存佔用,並且將覆蓋JFrame contentPane中的任何內容,包括具有MouseMotionListener的Frame實例。您想要將一個組件作爲繪圖組件添加到頂層窗口中,並只添加一次,在我的代碼中,這是我的SimpleDraw類的一個實例。 mouseMoved方法應該用於移動一個邏輯實體,在我的代碼中稱爲rect,然後調用repaint()
+0

感謝所有這些信息!對此,我真的非常感激! –

0

我的猜測是,你還需要調用任何組件上重繪()方法你每次更新後都會重新繪製。另外,您只需添加一次繪畫方法。你想要做的只是從鼠標監聽器調用它。 在主函數中創建P並將其添加到窗口中。
致電P.repaint();來自鼠標聽衆。 閱讀關於paintComponent()和MouseListeners的oracle文檔。

+0

我試過了,它沒有工作,任何其他的建議? –

+0

這個回答過度簡化了你的問題,並沒有解決你的錯誤的MouseMotionListener。 –