2014-11-03 92 views
1

我有4個類:從繪圖對象中清除窗口

Draw,Rectangle(extends Draw),FreeHand(extends Draw)和一個測試類。

我將自由手繪製的矩形和線添加到arrayList。

我有一個菜單選擇返回和清除。後退移除最後繪製的對象。這是通過移除數組列表中的最後一個對象來完成的。清除清除窗口。它是通過清除所有項目中的數組列表來完成的。

現在我的問題:窗口不清楚。我不知道如何編寫代碼以使其重新正確重繪,以便從窗口中移除項目。 你能幫我解釋一下這個代碼的樣子,以及我放在哪裏。我很感激,謝謝。

我的問題沒有2: 後,我在ArrayList中我需要繪製ArrayList中的所有項目已刪除的最後一個項目。我試過

for (Draw d : shapeList) { 
     d.draw(g2); 
    } 

但它不起作用。有什麼建議麼? 類抽獎:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JPanel; 

public abstract class Draw extends JPanel { 

    public int startX, startY, endX, endY, width, height, w, h; 
    public String color = "Black"; 

    public Draw(int startX, int startY, int width, int height) { 
     this.startX = startX; 
     this.startY = startY; 
     this.width = width; 
     this.height = height; 
    } 

    public abstract void draw(Graphics2D g); 


    @Override 
    public int getX() { 
     return startX; 
    } 

    public void setX(int startX) { 
     this.startX = startX; 
    } 

    @Override 
    public int getY() { 
     return startY; 
    } 

    public void setY(int startY) { 
     this.startY = startY; 
    } 

    @Override 
    public int getWidth() { 
     return width; 
    } 

    public void setWidth(int width) { 
     this.width = width; 
    } 

    @Override 
    public int getHeight() { 
     return height; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 
} 

類長方形:

import java.awt.Color; 
import java.awt.Graphics2D; 

public class Rectangle extends Draw { 

    public Rectangle(int x, int y, int width, int height) { 
     super(x, y, width, height); 
    } 

    @Override 
    public void draw(Graphics2D g2) { 
     switch (color) { 
      case "Red": 
       g2.setColor(Color.RED); 
       break; 
      case "Green": 
       g2.setColor(Color.GREEN); 
       break; 
      case "Blue": 
       g2.setColor(Color.BLUE); 
       break; 
      case "Yellow": 
       g2.setColor(Color.YELLOW); 
       break; 
      case "Orange": 
       g2.setColor(Color.ORANGE); 
       break; 
      case "Black": 
       g2.setColor(Color.BLACK); 
       break; 
      } 

     g2.drawRect(getX(), getY(), getWidth(), getHeight()); 
    } 
} 

類的FreeHand:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics2D; 

public class FreeHand extends Draw { 

    public FreeHand(int x, int y, int width, int height) { 
     super(x, y, width, height); 
    } 

    /* public FreeHand() { 
     super(); 
    }*/ 


    @Override 
    public void draw(Graphics2D g2) { 
     //Graphics2D g2 = (Graphics2D) g;   
     g2.setStroke(new BasicStroke(3));  
      switch (color) { 
      case "Red": 
       g2.setColor(Color.RED); 
       break; 
      case "Green": 
       g2.setColor(Color.GREEN); 
       break; 
      case "Blue": 
       g2.setColor(Color.BLUE); 
       break; 
      case "Yellow": 
       g2.setColor(Color.YELLOW); 
       break; 
      case "Orange": 
       g2.setColor(Color.ORANGE); 
       break; 
      case "Black": 
       g2.setColor(Color.BLACK); 
       break; 
      } 
     g2.drawLine(getX(), getY(), getWidth(), getHeight()); 
    } 
} 

的TestClass:

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import javax.swing.*; 

public class JavaApplication30 extends JFrame implements ActionListener { 

    public ArrayList<Draw> shapeList = new ArrayList<>(); 
    int startX, startY, endX, endY, w, h; 
    private JPanel topPanel; 
    private JPanel bottomPanel; 
    private JPanel orangePanel; 
    private JPanel greenPanel; 
    private JPanel bluePanel; 
    private JPanel blackPanel; 
    private JPanel redPanel; 
    private JPanel yellowPanel; 
    private JPanel leftPanel; 
    private JPanel rightPanel; 
    private JPanel colorPanel; 
    private JMenuBar menuBar; 
    private JMenu menu; 
    private JMenuItem menuItem1; 
    private JMenuItem menuItem2; 
    private JMenuItem menuItem3; 
    private JComboBox comboBox; 
    private JLabel leftLabel;   
    private JLabel commaLabel; 
    private JLabel colorLabel; 
    private static JLabel xLabel; 
    private static JLabel yLabel; 
    private final String labelText = "Coordinates: "; 
    private final String comma = ","; 
    private final String color = "Color: ";  
    private final String[] boxOptions = new String[] {"Rectangle", "Freehand"}; 
    private String pickedColor = "Black"; 
    private String x = ""; 
    private String y = "";  
    Container cp = getContentPane(); 
    private int count = 0; 



    public JavaApplication30(String title) { 
     super(title); 
     this.setLayout(new BorderLayout()); 
     this.setLocationRelativeTo(null);   
     this.setSize(840, 500);  
     this.initComponents(); 
     this.initMenu(); 
     this.setVisible(true); 
    } 


    private void initComponents() { 
     cp.setBackground(Color.WHITE); 

     comboBox = new JComboBox(boxOptions); 
     topPanel = new JPanel(new GridLayout(1,7));  
     bottomPanel = new JPanel(new GridLayout(1,2)); 
     orangePanel = new JPanel(); 
     greenPanel = new JPanel(); 
     bluePanel= new JPanel(); 
     blackPanel = new JPanel(); 
     redPanel = new JPanel(); 
     yellowPanel = new JPanel(); 
     colorPanel = new JPanel(); 
     rightPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     leftPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 

     comboBox.setSelectedIndex(0);   
     comboBox.addActionListener(this); 

     topPanel.setPreferredSize(new Dimension(0,40));   
     bottomPanel.setPreferredSize(new Dimension(0,30)); 
     colorPanel.setPreferredSize(new Dimension(60,20)); 

     leftLabel = new JLabel(labelText); 
     commaLabel = new JLabel(comma); 
     colorLabel = new JLabel(color); 

     bottomPanel.setBackground(Color.LIGHT_GRAY);   
     orangePanel.setBackground(Color.ORANGE);  
     greenPanel.setBackground(Color.GREEN); 
     bluePanel.setBackground(Color.BLUE);   
     blackPanel.setBackground(Color.BLACK);   
     redPanel.setBackground(Color.RED);  
     yellowPanel.setBackground(Color.YELLOW); 
     colorPanel.setBackground(Color.BLACK); 

     topPanel.add(orangePanel); 
     topPanel.add(greenPanel);        
     topPanel.add(bluePanel);         
     topPanel.add(blackPanel); 
     topPanel.add(redPanel); 
     topPanel.add(yellowPanel); 
     topPanel.add(comboBox); 
     rightPanel.add(colorLabel); 
     rightPanel.add(colorPanel); 
     bottomPanel.add(leftPanel);   
     bottomPanel.add(rightPanel); 

     this.add(topPanel, BorderLayout.PAGE_START);   
     this.add(bottomPanel, BorderLayout.PAGE_END); 

    } 


    @Override 
    public void paint(Graphics g) { 
     if(count == 0) { 
      cp.repaint(); 
     } 

     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     g2.setStroke(new BasicStroke(1)); 

     for (Draw d : shapeList) { 
      d.draw(g2); 
     } 


     if (startX != 0 && startY != 0 && endX != 0 && endY != 0) { 

      int width = Math.abs(startX - endX); 
      int height = Math.abs(startY - endY); 

      int minX = Math.min(startX, endX); 
      int minY = Math.min(startY, endY);    

      Rectangle r = new Rectangle(minX, minY, width, height); 

      g2.setPaint(Color.WHITE); 
      g2.fillRect(r.getX(), r.getY(), r.getWidth(), r.getHeight()); 
      r.setColor(pickedColor); 

      r.draw(g2); 
     } 
    } 



    @Override 
    public void actionPerformed(ActionEvent e) { 
     count++; 
     if (e.getSource().equals(menuItem1)) {    
      shapeList.clear(); 

      //Code to clear window 

     } 
     if (e.getSource().equals(menuItem2)) { 
      shapeList.remove(shapeList.size() - 1); 

      //Code to clear window 

      Graphics g = getGraphics();  
      Graphics2D g2 = (Graphics2D) g; 
      for (Draw d : shapeList) { 
       d.draw(g2); 
      }  
     } 


     if (e.getSource().equals(menuItem3)) { 
      //Exit 
     } 



     if (e.getSource().equals(comboBox)) {  

      JComboBox cb = (JComboBox)e.getSource(); 

      if (cb.getSelectedItem().equals("Rectangle")) { 

       this.addMouseListener(new MouseAdapter() {  

        @Override 
        public void mousePressed(MouseEvent e) {     
         startX = e.getX();  
         startY = e.getY(); 

         endX = startX; 
         endY = startY; 
         repaint();            

        } 

        @Override 
        public void mouseReleased(MouseEvent e) { 
         endX = e.getX(); 
         endY = e.getY(); 

         int width = Math.abs(startX - endX); 
         int height = Math.abs(startY - endY); 

         int minX = Math.min(startX, endX); 
         int minY = Math.min(startY, endY);    

         Rectangle r = new Rectangle(minX, minY, width, height); 
         shapeList.add(r); 
         r.setColor(pickedColor); 

         startX = 0; 
         startY = 0; 
         endX = 0; 
         endY = 0; 
         repaint(); 
        } 
       });  

       this.addMouseMotionListener(new MouseMotionAdapter() { 
        @Override 
        public void mouseDragged(MouseEvent e) { 
         endX = e.getX(); 
         endY = e.getY(); 
         repaint(); 
        } 
       }); 
      }    


      else if (cb.getSelectedItem().equals("Freehand")) { 

       this.addMouseListener(new MouseAdapter() {     
        @Override 
        public void mousePressed(MouseEvent e) {     
         startX = e.getX(); 
         startY = e.getY();    
        } 
       }); 

       this.addMouseMotionListener(new MouseMotionAdapter() { 
        @Override 
        public void mouseDragged(MouseEvent e) {     
         Graphics g = getGraphics();  
         Graphics2D g2 = (Graphics2D) g;   

         FreeHand fh = new FreeHand(startX, startY, e.getX(), e.getY()); 
         shapeList.add(fh); 
         fh.setColor(pickedColor); 
         fh.draw(g2);      
         startX = e.getX(); 
         startY = e.getY();       
        } 
       });  
      } 
     } 
    } 





    private void initMenu() { 

     menuBar = new JMenuBar(); 
     menu = new JMenu("File"); 
     menuBar.add(menu); 


     menuItem1 = new JMenuItem("Clear"); 
     menuItem2 = new JMenuItem("Back"); 
     menuItem3 = new JMenuItem("Exit"); 
     menu.add(menuItem1); 
     menu.add(menuItem2); 
     menu.addSeparator(); 
     menu.add(menuItem3); 

     menu.setMnemonic(KeyEvent.VK_A);            
     KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK); //Crtl+n 
     KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK); //Ctrl+i 
     KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK); //Ctrl+e  
     menuItem1.setAccelerator(ks1); 
     menuItem2.setAccelerator(ks2); 
     menuItem3.setAccelerator(ks3); 

     menuItem1.addActionListener(this);  
    menuItem2.addActionListener(this); 
    menuItem3.addActionListener(this); 

     setJMenuBar(menuBar);    
    } 




    public static void main(String args[]) { 
     new JavaApplication30("Draw"); 
    } 
} 

回答

4

你的問題看起來是你的paint方法是不打電話給th e超的油漆方法,因爲這將使組件清除所有「髒」圖像位本身。但話雖如此,你不應該直接在JFrame中繪製。而是畫在一個JComponent或JPanel的paintComponent的方法裏面,在這種方法一定要調用父類的的paintComponent方法:

public class MyDrawingPanel extends JPanel { 

    @Override 
    proteced void paintComponent(Graphics g) { 
     super.paintComponent(g); // don't forget this! 

     // do your drawing here 
    } 
} 

而且,爲什麼你的繪圖類,因此所有類從它派生,延長JPanel何時不被用作JPanel?這樣就給這些類提供了很多不必要的開銷。


編輯
你問:

所以你的意思是我應該在油漆方法移到一切到繪製的paintComponent法?爲什麼保護?

不,我認爲Draw不應該擴展JPanel,而應該是一個邏輯類,而不是Swing組件派生類。我認爲你應該創建一個新的類,稱爲MyDrawingPanel,你可以在其中完成所有的繪圖。請參閱上面的代碼片段。此外,paintComponent在JComponent中聲明爲受保護的,不公開,我認爲在覆蓋它時公開它沒有優勢,所以我建議將它保留。

請閱讀Swing Info Links以查看Swing圖形教程並給他們閱讀。


編輯2
您還使用一個組件上的getGraphics()電話的方式獲得Graphics對象,也不好,因爲這會返回一個不穩定的Graphics對象。而是在paintComponent方法或BufferedImage中繪製(再次繪製在paintComponent中)。


編輯3

我的一些代碼示例:

+0

所以,你的意思是我應該將test-class中的paint-method中的所有內容移至Draw中的paintComponent-method? 我不能這樣做,因爲我有testList中的arrayList ... – user2939293 2014-11-03 21:49:15

+0

@ user2939293:請參閱編輯以回答。 – 2014-11-03 21:51:34

+0

可能因爲我不知道如何在一開始就製作結構。所以你說這都是錯的,我必須重新開始? – user2939293 2014-11-03 21:52:47