2017-06-06 89 views
-1

程序應做到以下幾點:計劃,跟蹤鼠標座標,並允許畫線在一個窗口

  1. 打開一個窗口。在窗口中獲取鼠標的位置(x和y座標)並將它們設置爲窗口的標題。
  2. 如果你點擊並按住鼠標左鍵,你應該可以繪製一條線。

問題是當我運行程序沒有。 1有效,但不是。 2.調整窗口大小後,座標會凍結,但我可以畫線。

希望有人能幫到這個。

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Point; 

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

public class Main extends JPanel { 

    private Point lastPoint; 


    public Main() { 
     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       lastPoint = new Point(e.getX(), e.getY()); 
      } 
     }); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       Graphics g = getGraphics(); 
       g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY()); 
       lastPoint = new Point(e.getX(), e.getY()); 
       g.dispose(); 
      } 
     }); 
    } 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setResizable(true); 
     frame.setVisible(true); 
     frame.getContentPane().add(new Main(), BorderLayout.CENTER); 
     frame.addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(MouseEvent e) { 
       int x = e.getX(); 
       int y = e.getY(); 
       String xstring = String.valueOf(x); 
       String ystring = String.valueOf(y); 
       frame.setTitle(xstring + ", " + ystring); 
     } 
     }); 
     } 

} 

回答

0

如果您添加以下的MouseMotionAdapter你可以看到你的標題是如何同時拖動鼠標調整。 也許你可以從那裏斟酌。

public void mouseDragged(MouseEvent e) { 
    int x = e.getX(); 
    int y = e.getY(); 
    String xstring = String.valueOf(x); 
    String ystring = String.valueOf(y); 
    frame.setTitle("dragged - " + xstring + ", " + ystring); 
} 

進行實驗一點點,然後導致了這樣的代碼:

public class Draw { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setResizable(true); 
     frame.setVisible(true); 
     JPanel myPanel = new MyPanel(); 
     frame.getContentPane().add(myPanel, BorderLayout.CENTER); 
     myPanel.addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(MouseEvent e) { 
       int x = e.getX(); 
       int y = e.getY(); 
       String xstring = String.valueOf(x); 
       String ystring = String.valueOf(y); 
       frame.setTitle(xstring + ", " + ystring); 
       ((MyPanel) myPanel).setLastPoint(e); 
      } 

      public void mouseDragged(MouseEvent e) { 
       int x = e.getX(); 
       int y = e.getY(); 
       String xstring = String.valueOf(x); 
       String ystring = String.valueOf(y); 
       frame.setTitle("dragged - " + xstring + ", " + ystring); 

       Graphics g = myPanel.getGraphics(); 
       Point lastPoint = ((MyPanel) myPanel).getLastPoint(); 
       g.drawLine(lastPoint.x, lastPoint.y, e.getX(), e.getY()); 
       ((MyPanel) myPanel).setLastPoint(new Point(e.getX(), e.getY())); 
       g.dispose(); 
      } 
     }); 
    } 
} 

class MyPanel extends JPanel { 
    private Point lastPoint; 

    public Point getLastPoint() { 
     return lastPoint; 
    } 

    public void setLastPoint(Point point) { 
     lastPoint = point; 

    } 

    public void setLastPoint(MouseEvent e) { 
     lastPoint = new Point(e.getX(), e.getY()); 
    } 
} 
0

幾個在這裏的東西:

當你想定製Component的畫,覆蓋其paintComponent方法,不要」試圖通過getGraphics獲取其Graphics對象。

使用repaint()讓您的Component被重新粉刷(即paintComponent將被調用)。

只有在添加了所有其他組件後,纔會顯示您的JFrame

這裏是你的代碼是如何可以改變:

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

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

public class Main extends JPanel { 

    private Point lastPoint = new Point(); 
    private Point currentPoint = new Point(); 

    public Main() { 
     addMouseListener(new MouseAdapter() { 
      public void mousePressed(final MouseEvent e) { 
       lastPoint = new Point(e.getX(), e.getY()); 
      } 
     }); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(final MouseEvent e) { 

       currentPoint = new Point(e.getX(), e.getY()); 
       repaint(); 

      } 
     }); 
    } 

    @Override 
    public void paintComponent(final Graphics g) { 

     super.paintComponent(g); 

     g.drawLine(lastPoint.x, lastPoint.y, currentPoint.x, currentPoint.y); 

    } 

    public static void main(final String[] args) { 
     // TODO Auto-generated method stub 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setResizable(true); 

     frame.getContentPane().add(new Main(), BorderLayout.CENTER); 
     frame.addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseMoved(final MouseEvent e) { 
       int x = e.getX(); 
       int y = e.getY(); 
       String xstring = String.valueOf(x); 
       String ystring = String.valueOf(y); 
       frame.setTitle(xstring + ", " + ystring); 
      } 
     }); 
     frame.setVisible(true); 
    } 

}