2014-10-28 48 views
0

因此,我創建了一個程序,允許用戶在JPanel上繪製多個形狀,類似於繪畫程序。問題是,當我嘗試向存儲所有形狀的ArrayList添加一行,然後在JPanel上重新繪製它們時,該行將被存儲但不會重繪。JPanel上沒有重繪線條

因此,例如,假設我從頂部的JMenu中選擇了線工具。然後,我點擊並拖動,並且從我點擊鼠標到當前位置的位置出現該線。我釋放鼠標,線路仍然存在。當我去繪製另一條線時,點擊並拖動,第一條線鬆開鼠標後消失。我怎樣才能得到它,這樣該行將保留在JPanel上?

import ... 

public class GraphicsTest { 

    public GraphicsTest() { 
     JFrame frame = new JFrame(""); 
     Painter painter = new Painter(); 
     frame.setLayout(new BorderLayout()); 
    // frame.setJMenuBar(painter.createMenuBar()); 
     frame.add(painter,BorderLayout.CENTER);   
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(750,488); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new GraphicsTest(); 
      } 
     }); 
    } 

    public class Painter extends JPanel implements MouseListener, MouseMotionListener { 
     private java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double(); 

     private List<Shape> shapeList = new ArrayList<Shape>(); 
     private List<Integer> opNumList = new ArrayList<Integer>(); 

     // Initial color 
     private Color color = Color.black; 

     // int variables that determine the position of various on-screen objects 
     private int dragX = 0, dragY = 0, downX = 0, downY = 0, upX = 0, upY = 0; 

     // Fields that determine which tool should be used 
     private int PEN = 0, LINE = 1, RECTANGLE = 2, OVAL = 3; 

     // Initial tool used 
     private int toolNum = LINE; 

     private Point clickPoint, releasePoint; 

     /** 
     * Sole and default constructor of this class 
     **/ 
     public Painter() { 
      // Adding listeners so that the mouse may be used to draw various objects 
      addMouseListener(this); 
      addMouseMotionListener(this); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int index = 0; 
      Graphics2D g2 = (Graphics2D) g.create(); 
      g2.setColor(color); 

      if (toolNum == LINE) { 
       g2.draw(new java.awt.geom.Line2D.Double(downX,downY,dragX,dragY)); 
      } 

      System.out.println("Size: " + shapeList.size()); 
      if (!opNumList.isEmpty()) { 
       for (Shape s : shapeList) { 
       // System.out.println("Index: " + index); 
       // System.out.println("Element: " + opNumList.get(index)); 
       // System.out.println(s); 
        System.out.println(); 
        switch (opNumList.get(index)) { 
         case 41: g2.setColor(Color.black); g2.draw(s); break; 
         default: return; 
        } 
        index++; 
       } 
      } 
     } 

     /** 
     * MouseListener interface methods 
     **/ 
     @Override 
     public void mouseClicked(MouseEvent ev) {} 

     @Override 
     public void mouseEntered(MouseEvent ev) {} 

     @Override 
     public void mouseExited(MouseEvent ev) {} 

     @Override 
     public void mousePressed(MouseEvent ev) { 
      clickPoint = new Point(ev.getPoint()); 
      upX = ev.getX(); 
      upY = ev.getY(); 
      downX = ev.getX(); 
      downY = ev.getY(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent ev) { 
      upX = ev.getX(); 
      upY = ev.getY(); 
      releasePoint = new Point(ev.getPoint()); 

      line.x1 = clickPoint.x; 
      line.y1 = clickPoint.y; 
      line.x2 = releasePoint.x; 
      line.y2 = releasePoint.y; 

      if (toolNum == LINE) 
       shapeList.add(line); 

      if (color == Color.black) { 
       if (toolNum == LINE) 
        opNumList.add(41); 
      } 
      repaint(); 
     } 

     /** 
     * MouseMotionListener interface methods 
     **/ 
     @Override 
     public void mouseMoved(MouseEvent ev) {} 

     @Override 
     public void mouseDragged(MouseEvent ev) { 
      dragX = ev.getX(); 
      dragY = ev.getY(); 

      repaint(); 
     } 
    } 
} 

回答

1

你永遠只能創建line單個實例...

private java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double(); 

你再更新的Line

line.x1 = clickPoint.x; 
line.y1 = clickPoint.y; 
line.x2 = releasePoint.x; 
line.y2 = releasePoint.y; 

這種情況下這意味着,在shapeList每個條目是相同的對象,具有相同的屬性。所以,是的,你的代碼在shapeList中繪製EVERY行,它只是多次繪製同一行...

相反,每次你想添加一個新行時,創建一個新的實例...

Line2D line = new java.awt.geom.Line2D.Double(); 
line.x1 = clickPoint.x; 
line.y1 = clickPoint.y; 
line.x2 = releasePoint.x; 
line.y2 = releasePoint.y; 

然後將其添加到shapeList ...

+0

有趣......我沒想到我會被添加在同一行對象的全部時間和修改其端點的只是座標。謝謝! – TNT 2014-10-28 23:23:22

+0

很高興幫助.... – MadProgrammer 2014-10-28 23:44:51