2013-04-04 41 views
1

這裏是代碼。當框架在屏幕上移動時,鼠標不保持它的位置

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.MouseInfo; 
import java.awt.Point; 
import java.awt.PointerInfo; 
import java.awt.Robot; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JPanel; 


public class Paint extends JPanel implements MouseMotionListener, MouseListener { 

    public Paint() {   
     setBackground(Color.RED); 
     addMouseMotionListener(this); 
     addMouseListener(this); 
    } 

    private boolean clicked = false; 

    public void paintComponent (Graphics g) { 
     super.paintComponent(g); 
     PointerInfo a = MouseInfo.getPointerInfo(); 
     Point b = a.getLocation(); 
     int x = (int) b.getX() - 3; 
     int y = (int) b.getY() - 23; 

     if (clicked) { 
      g.drawLine(x, y-5000, x,y+5000); 
      g.drawLine(x+5000,y,x-5000,y); 
      g.setColor(Color.white); 
     } 

     g.drawLine(x, y-5000, x,y+5000); 
     g.drawLine(x+5000,y,x-5000,y); 
     g.setColor(Color.black); 




     // . . . 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     repaint(); 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     repaint(); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

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

    } 

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

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     clicked = true; 
     repaint(); 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     clicked = false; 
     repaint(); 

    } 




} 

public class Frame extends JFrame { 

    public Frame() { 
     this.setSize(500,500); 
     this.setTitle("Test painting"); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 

     Paint panel = new Paint(); 

     this.add(panel); 

     this.setVisible(true); 
    } 

    public static void main (String[] args) { 
     new Frame(); 

    } 



} 

當我運行程序時,它看起來像它工作正常,當應用程序在默認位置,但一旦我移動小程序,我想在屏幕上,該行不會維持目前的鼠標在屏幕上的位置。

有人可以告訴我我哪裏出了問題或如何解決這個問題?

回答

3

繪畫是從組件的上下文完成的。任何給定組件的Graphics上下文都會被翻譯,因此頂部左角是0x0。

MouseInfo.getPointerInfo().getLocation()返回鼠標在屏幕上的位置,而不是相對於組件的位置。

雖然有辦法解決它,但更好的解決方案是簡單地使用MouseMotionListener來代替。發送到這個方法的MouseEvent已經被翻譯到組件的座標空間...

public void mouseMoved(MouseEvent me) { 
    myPoint = me.getPoint(); 
} 

然後在你paintComponent方法,簡單的參考,而不是試圖用MouseInfo

+0

呀感謝myPoint,這個工程。雖然它把我帶到一個空指針。有沒有什麼辦法可以設置臨時點,以便在加載程序時不會拋出空指針? \t private int x =(int)myPoint.getX(); – user 2013-04-04 00:32:03

+1

在你的'paintComponent'方法中,只需檢查'myPoint'是否爲'null',如果是的話,不要打擾繪畫任何東西。你可以初始化你想要的任何東西......'myPoint = new Point(0,0)'例如 – MadProgrammer 2013-04-04 00:35:02

+0

哦,當然,謝謝。 – user 2013-04-04 00:36:23

1

我認爲在MouseAdapter中改變你的班級的狀態會更好,請致電repaint(),然後讓你的paintComponent(...)方法使用此狀態來幫助繪製。這似乎比在paintComponent(...)中使用MouseInfo更清潔和更安全。

除此之外,如果你需要更具體的幫助,考慮

  • 告訴我們更多關於它究竟你正在試圖做的,以及如何你的程序無法正常工作。
  • 創建併發布sscce,這是一個小型可編譯和可運行的程序,可以爲我們展示您的問題。
相關問題