2013-09-16 90 views
0

如何將多個矩形繪製到JPanel?將多個矩形繪製到JPanel

此處的代碼只允許我一次繪製一個矩形。一旦我開始一個新的矩形,它將刪除以前創建的矩形。我需要編寫一個繪製多於一個矩形的程序,所以它可能看起來像是不同顏色矩形的拼貼。

public class Rectangles extends JFrame implements ActionListener { 

int x1, y1, x2, y2; 

JPanel main; 
JPanel right; 

JButton color1; 
JButton color2; 
JButton color3; 
JButton color4; 
JButton color5; 
JButton color6; 
JButton color7; 
JButton color8; 
JButton color9; 
JButton color10; 

Canvas left; 

public Rectangles() { 
    main = new JPanel(new BorderLayout(5, 5)); 
    main.setBorder(new EmptyBorder(20, 20, 20, 20)); 
    main.setBackground(new Color(0, 168, 165)); 

    right = new JPanel(new GridLayout(5, 2, 3, 3)); 
    right.setPreferredSize(new Dimension(150, 250)); 
    right.setBackground(new Color(0, 168, 165)); 

    color1 = new JButton(); 
    color1.setBackground(Color.LIGHT_GRAY); 
    color1.addActionListener(this); 
    color1.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color2 = new JButton(); 
    color2.setBackground(Color.BLUE); 
    color2.addActionListener(this); 
    color2.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color3 = new JButton(); 
    color3.setBackground(Color.CYAN); 
    color3.addActionListener(this); 
    color3.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color4 = new JButton(); 
    color4.setBackground(Color.DARK_GRAY); 
    color4.addActionListener(this); 
    color4.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color5 = new JButton(); 
    color5.setBackground(Color.GRAY); 
    color5.addActionListener(this); 
    color5.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color6 = new JButton(); 
    color6.setBackground(Color.GREEN); 
    color6.addActionListener(this); 
    color6.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color7 = new JButton(); 
    color7.setBackground(Color.YELLOW); 
    color7.addActionListener(this); 
    color7.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color8 = new JButton(); 
    color8.setBackground(Color.MAGENTA); 
    color8.addActionListener(this); 
    color8.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color9 = new JButton(); 
    color9.setBackground(Color.PINK); 
    color9.addActionListener(this); 
    color9.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    color10 = new JButton(); 
    color10.setBackground(Color.RED); 
    color10.addActionListener(this); 
    color10.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    right.add(color1); 
    right.add(color2); 
    right.add(color3); 
    right.add(color4); 
    right.add(color5); 
    right.add(color6); 
    right.add(color7); 
    right.add(color8); 
    right.add(color9); 
    right.add(color10); 

    left = new Canvas(); 
    left.setPreferredSize(new Dimension(500, 250)); 
    left.setBackground(Color.WHITE); 
    left.setColor(Color.WHITE); 
    left.setBorder(new LineBorder(Color.BLACK, 5, false)); 

    main.add(left, BorderLayout.CENTER); 
    main.add(right, BorderLayout.EAST); 

    this.add(main); 
    this.pack(); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setLocation(450,75); 
    this.setTitle("MARQUEZ Rectangles"); 
    this.setResizable(false); 
    this.setVisible(true); 
} 

public static void main(String[] args) { 
    Rectangles r = new Rectangles(); 
} 

public void actionPerformed(ActionEvent e) {   
    if(e.getSource() == color1) { 
     left.setColor(Color.LIGHT_GRAY); 
    } 

    else if(e.getSource() == color2) { 
     left.setColor(Color.BLUE); 
    } 

    else if(e.getSource() == color3) { 
     left.setColor(Color.CYAN); 
    } 

    else if(e.getSource() == color4) { 
     left.setColor(Color.BLACK); 
    } 

    else if(e.getSource() == color5) { 
     left.setColor(Color.GRAY); 
    } 

    else if(e.getSource() == color6) { 
     left.setColor(Color.GREEN); 
    } 

    else if(e.getSource() == color7) { 
     left.setColor(Color.YELLOW); 
    } 

    else if(e.getSource() == color8) { 
     left.setColor(Color.MAGENTA); 
    } 

    else if(e.getSource() == color9) { 
     left.setColor(Color.PINK); 
    } 

    else { 
     left.setColor(Color.RED); 
    } 
} 
} 

該類繪製矩形。

class Canvas extends JPanel implements MouseListener,MouseMotionListener { 
private int x,y,x1,y1; 
Color color; 

public Canvas() { 
    this.addMouseListener(this); 
    this.addMouseMotionListener(this); 
} 

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

public void mouseEntered(MouseEvent e) {} 
public void mouseClicked(MouseEvent e) {} 
public void mouseReleased(MouseEvent e) {} 
public void mouseMoved(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 

public void mousePressed(MouseEvent e) { 
    x = e.getX(); 
    y = e.getY(); 
} 

public void mouseDragged(MouseEvent e) { 
    x1 = e.getX(); 
    y1 = e.getY(); 
    revalidate(); 
    repaint(); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(color); 
    g.fillRect(x, y, Math.abs(x-x1), Math.abs(y-y1)); 
} 
} 
+0

更具體與您的問題是什麼吧。 – arynaq

+0

那麼這10個按鈕是不是顯示出來?還是僅僅是你製作的畫布課程不工作? – chancea

+0

@chancea代碼工作正常;然而,它只繪製一個矩形,每當我繪製一個新矩形時,它將刪除先前製作的矩形。 – NoobProgrammer

回答

2

我們所做的油漆操作是'瞬態的',並且在下一次組件被着色時將被破壞。爲了解決這個問題,有兩種常用的技術。

  1. 存儲形狀列表(圖像,漸變和其他繪畫操作),將當前圖形添加到列表中,並在請求時將它們全部繪製。
  2. 繪製到BufferedImage,當需要/需要時繪製。一個例子見this answer

    ​​
1

你的畫布僅繪製最新的矩形,擺動繪畫作品一樣,一旦油漆要求在先前的緩衝區被清空。你需要的是一個List<Rectangle>,每次你用鼠標選擇一個矩形,將它添加到列表中並在畫布中繪製列表中的每個矩形。您還需要保存以前矩形的顏色,可以通過爲包含顏色的矩形創建一個包裝類來作爲字段,也可以將其保存在列表中。