2012-04-18 83 views
2

我想在鼠標拖動時在JPanel上繪製2(或更多)行。當我在我的代碼使用super.paintComponent(g) ,我不能得出2號線在面板上,但是當我不使用super.paintComponent(g);,其結果是醜陋的,如下面的圖:拖動鼠標時在Jpanel上繪製線條

enter image description here

我明白爲什麼這些線的行爲如此。

如何在拖動鼠標時在Jpanel上繪製線條? 順便說一句,通過g2d.draw(line2d)繪製的線有時它不是平滑線(下面圖)

enter image description here

我的代碼到目前爲止:

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 


public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{ 
    Point point1; 
    Point point2; 
    Line2D line2d; 

    public LineDrawing(){ 
     super(); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

@Override 
    public void paintComponent(Graphics g){ 

    //super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     if(point1!=null && point2!=null){ 

      g2d.setPaint(Color.RED); 
      g2d.setStroke(new BasicStroke(1.5f)); 
      g2d.draw(line2d); 

     } 
     } 


    @Override 
    public void mouseDragged(MouseEvent e) { 

    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    repaint(); 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    point1 = e.getPoint(); 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

@Override 
public void mouseEntered(MouseEvent e) { 

} 

@Override 
public void mouseExited(MouseEvent e) { 

} 


public static void main(String a[]){ 
    EventQueue.invokeLater(new Runnable(){ 
     @Override 
     public void run() { 

     JFrame frame = new JFrame(); 
     LineDrawing linedraw= new LineDrawing(); 
     frame.add(linedraw); 
     frame.setSize(500,500); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

         } 
       }); 
    } 

}

回答

4

..draw 2行

這似乎是這個問題的癥結所在。

單擊/拖動時,在可展開列表中保留線條集合(例如ArrayList),將新行添加到列表中並呼叫repaint()。在paintComponent(Graphics)中,迭代集合並繪製每一行。

順便說一句 - 我猜你沒有最小化和恢復你的窗口,而測試這個。你的線條(美麗或醜陋)會消失!


..they消失。什麼原因?

無論何時需要重繪GUI,都會調用方法paint()paintComponent()。他們可能會在另一個窗口出現在應用程序前被調用,然後它被帶回到前面。另一次是從最小化恢復後。

保留線的選項包括:

  • 商店的路線的位置和重新繪製它們全部每當問(如上所述)。這可以用於大多數目的。即使有數百行代碼,GUI也會在「眨眼之間」重新繪製它們。
  • 將每一行繪製到BufferedImage,並將圖像放在(ImageIcon)中的一個JLabel。如果繪圖區域具有固定的大小,則此方法可以很好地工作。&任何東西都不會被移除,並且可以容納數百萬行,弧線,半透明區域,較小的圖像,文本。使用圖像作爲渲染表面,您將不再需要ArrayList,因爲您所做的只是爲圖像添加一條新線條,並重新繪製標籤以查看新線條和所有以前的線條。

..the線不是直線。

這是因爲繪製線條時使用了「渲染提示」。由對齊的像素行構成的屏幕只能使垂直或水平線完美。爲了在任何其他角度給出連續直線的'錯覺',需要一種稱爲dithering的技術。請閱讀Graphics2D的開頭部分以獲取RenderingHints的更多解釋和說明。

+0

你說得對,他們消失了。什麼原因? – 2012-04-18 13:43:32

+0

謝謝。順便說一句,paintComponent繪製的線 - 有時不是平滑線。我怎樣才能擺脫這一點? – 2012-04-18 14:24:25

+0

我編輯了這個問題,所以你可以在圖片上看到 - 這條線不是直線。我的意思是一些線條,而不是全部線條。 – 2012-04-18 14:34:58

1

我不知道我得到你的問題,但如果你想畫一條連續的線。拖動時必須更新最後一個點的位置。

@Override 
    public void mouseDragged(MouseEvent e) { 
    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    point1 = point2; // add this line 
    repaint(); 
    } 
+0

我不想繪製連續的線,我想要分離線。 – 2012-04-18 13:42:44