2016-02-27 74 views
0

我不確定如何存儲使用類型形狀的一個數組列表的多個不同的形狀。這是主要的。存儲形狀在JComponent中

public class A1 { 
public static boolean rDraw = false; 
public static boolean eDraw = false; 
public static boolean lDraw = false; 
public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JButton rect = new JButton("Rectangle"); 
    rect.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(e.getSource()==rect){ 
       rDraw = true; 
       eDraw = false; 
       lDraw = false; 
      } 
     } 
    }); 
    JButton ellipse = new JButton("Ellipse"); 
    ellipse.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(e.getSource()==ellipse){ 
       rDraw = false; 
       eDraw = true; 
       lDraw = false;  
      } 
     } 
    }); 
    JButton edge = new JButton("Edge"); 
    edge.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e){ 
      if(e.getSource() == edge){ 
       rDraw = false; 
       eDraw = false; 
       lDraw = true;  
      } 
     } 
    }); 
    JButton label = new JButton("Label"); 
    JTextField labelField = new JTextField(20); 
    JPanel panel = new JPanel(); 
    panel.add(rect); 
    panel.add(ellipse); 
    panel.add(edge); 
    panel.add(label); 
    panel.add(labelField); 
    frame.add(panel,BorderLayout.NORTH); 
    JComponent canvas = new Canvas(); 
    frame.add(canvas,BorderLayout.CENTER); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 600); 
    frame.setTitle("Graph Draw"); 
    frame.setVisible(true); 
    } 
} 

在我的畫布中,我不確定如何使用drawShape?以及在paintComponent中放置什麼來存儲形狀。

public class Canvas extends JComponent { 
private Point p,p2; 
private Rectangle r; 
private Ellipse2D ep; 
private Line2D l; 
ArrayList<Shape> shapes = new ArrayList<Shape>(); 

public Canvas(){ 
    class MyMouseListener implements MouseListener{ 
     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

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

     } 

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

     } 
     @Override 
     public void mousePressed(MouseEvent e) { 
      if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){ 
       p = e.getPoint(); 
       r = new Rectangle(p.x, p.y, p.x - p.x, p.y - p.y); 
      } 
      else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){ 
       p = e.getPoint(); 
       ep = new Ellipse2D.Double(p.x, p.y, p.x - p.x, p.y - p.y); 
      } 
      else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){ 
       p = e.getPoint(); 
       l = new Line2D.Double(p.x, p.y, p.x - p.x, p.y - p.y); 
      } 
     } 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){ 
       if (r.width != 0 || r.height != 0) 
       { 
        addRectangle(r); 
       } 

       r = null; 
      } 
      else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){ 
       if (ep.getWidth() != 0 || ep.getHeight() != 0){ 
        addEllipse(ep); 
       } 
       ep = null; 
      } 
      else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){ 
       if (l.getP1() != null || l.getP2() != null){ 
        addLine(l); 
       } 
       l = null; 
      } 
     } 
    } 
    class MyMouseMotionListener implements MouseMotionListener{ 
     @Override 
     public void mouseDragged(MouseEvent e) { 
      if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){ 
       int x = Math.min(p.x, e.getX()); 
       int y = Math.min(p.y, e.getY()); 
       int width = Math.abs(p.x - e.getX()); 
       int height = Math.abs(p.y - e.getY()); 
       r.setBounds(x, y, width, height); 
       repaint(); 
      } 
      else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){ 
       int x = Math.min(p.x, e.getX()); 
       int y = Math.min(p.y, e.getY()); 
       int width = Math.abs(p.x - e.getX()); 
       int height = Math.abs(p.y - e.getY()); 
       ep.setFrame(x, y, width, height); 
       repaint(); 
      } 
      else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){ 
       p2 = e.getPoint(); 
       l.setLine(p, p2); 
       repaint(); 
      } 
     } 
     @Override 
     public void mouseMoved(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 
    } 
    MouseListener mListener = new MyMouseListener(); 
    addMouseListener(mListener); 
    MouseMotionListener mmListener = new MyMouseMotionListener(); 
    addMouseMotionListener(mmListener); 
} 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    for (Shape shape:shapes){ 

    } 
    if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){ 
     g2d.draw(r); 
    } 
    else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){ 
     g2d.draw(ep); 
    } 
    else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){ 
     g2d.draw(l); 
    } 
} 
public void addRectangle(Rectangle rect){ 
    if(r != null){ 
     Rectangle cR = new Rectangle(rect); 
     shapes.add(cR); 
     repaint(); 
    } 
} 
public void addEllipse(Ellipse2D ellipse){ 
    if (ep != null){ 
     Ellipse2D cEp = new Ellipse2D.Double(ellipse.getX(),ellipse.getY(),ellipse.getWidth(),ellipse.getHeight()); 
     shapes.add(cEp); 
     repaint(); 
    } 
} 
public void addLine(Line2D line){ 
    if(l != null){ 
     Line2D cL = new Line2D.Double(line.getP1(), line.getP2()); 
     shapes.add(cL); 
     repaint(); 
    } 
} 
} 
+1

'「...以及在paintComponent中放置什麼來存儲形狀。」 - 這不應該是paintComponent方法的一部分。此方法用於繪製組件上的項目,僅此而已。它不應該用於程序邏輯。用於存儲形狀的代碼應該在您的鼠標偵聽器類型代碼中,而不是在paintComponent中。 –

+0

在paintComponent方法的for循環中,應該有'g2d.draw(shape);'。 –

+0

for循環後的paintComponent方法中的所有代碼都應該被刪除。 –

回答

3

你的paintComponent方法似乎做得太多和太少:太少了,它不是繪製形狀,而過分的,因爲它正試圖做的事情與靜態布爾字段,它不應該。

「...以及在paintComponent中放置什麼來存儲形狀。」

這不應該是的paintComponent方法的一部分。此方法用於繪製組件上的項目,僅此而已。它不應該用於程序邏輯。用於存儲形狀的代碼應該在您的鼠標偵聽器類型代碼中,而不是在paintComponent中。

我認爲所有你需要的paintComponent很簡單:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    for (Shape shape : shapes) { 
     g2d.draw(shape); // !! added 
    } 
} 

作爲一對夫婦的旁註:

  • 你有你的A1類中太多太多的靜態代碼,包括靜態字段,並且大多數情況下都應該是實例代碼,並且主方法中的大部分代碼都應該被移除並放入構造函數中。主要方法應該非常小。
  • 你會想你的Canvas類重命名爲不同的東西,因爲這造成了潛在的名稱衝突具有核心Java類,java.awt.Canvas,並可能會迷惑他人,甚至編譯器,你應該這個類移動到另一個包中的未來。
  • 您可以將您的MouseListener和MouseMotionListener和代碼合併成擴展MouseAdapter一個類。這將簡化您的代碼,並允許您避免發佈空方法停止。
  • 由於繪圖的選擇是相互排斥的,我會用JradioButton將或JToggleButtons在一個ButtonGroup中所有持有,這樣用戶可以很容易地看到什麼選擇當前活躍,所以一個按鍵即可選擇關閉的所有選擇的其他。
+0

感謝您的幫助,現在保存工作正常;但是,我不再獲得平滑的繪圖(拖動鼠標時,我看不到該形狀的輪廓),因爲現在我只是拖動並隨機出現一個形狀。我遵循你的建議並修正了命名。關於主類,我不確定你的意思是太多的靜態代碼。 – JClutch

+0

@JClutch:好的,那麼我錯了,也許你需要paintComponent中for循環之後的代碼。 Re靜態的,主要的方法應該是非常小的,也許有幾行,它的工作應該是創建你的主類('new Something()')並設置它的運行。目前主要方法中的大部分代碼都是構建GUI的代碼,不應該存在於此處。 –

+0

@JClutch:你的存儲總是可以正常工作 - 你從來沒有用過Graphics2D對象來繪製存儲的內容。一個簡單的修復。 1+對你的問題 - 我不確定爲什麼它被低估了。 –