2017-04-25 133 views
0

我想要实现的是两个按钮,使用户可以选择颜色(黑色或红色),然后根据颜色绘制红色或黑色形状,例如,画布上的矩形。 我有一个与按钮连接的MouseListeners有关设置Canvas类中图形颜色的问题。我应该在哪里定义颜色?Java - 选择在画布上画什么

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

class Can extends Canvas{ 
    int x,y; 
    ArrayList<Point> points = new ArrayList<Point>(); 
    Can(){ 
      super(); 
      addMouseListener(new MouseAdapter(){ 
       public void mousePressed(MouseEvent k){ 
        x = k.getX(); 
        y = k.getY(); 
        points.add(new Point(x,y)); 
        repaint(); 
       } 
     }); 
    } 
    public void paint(Graphics g){ 
     int x2, y2; 
     Graphics2D g2 = (Graphics2D) g; 

     g2.setColor(Color.black); //here is only black 
     for(Point p:points) 
     { 
      x2=(int)p.getX(); 
      y2=(int)p.getY(); 
      g2.fillRect(x2, y2, 10, 5); 

     } 
    } 
} 
class Win extends JFrame{ 
    Win(String name){ 
     super(name); 
     setLayout(new GridLayout()); 
     JPanel p1 = new JPanel(new FlowLayout()); 
     p1.setBackground(Color.cyan); 

     CheckboxGroup cg = new CheckboxGroup(); 
     Checkbox red = new Checkbox("red", cg, true); 
     Checkbox black = new Checkbox("black", cg, false); 
     p1.add(red); 
     p1.add(black); 
     add(p1); 

     Can k = new Can(); 
     add(k); 

     red.addMouseListener(new MouseAdapter(){ 
      public void mousePressed(MouseEvent me){ 

       System.out.println("Mouse click on red");  
      }  
     }); 

     black.addMouseListener(new MouseAdapter(){ 
      public void mousePressed(MouseEvent me){ 

       System.out.println("Mouse click on black"); 
      }  
     }); 

     setSize(600, 400); 

     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 
} 

public class ItM { 

    public static void main(String[] args) { 

     Win o = new Win("that's the window"); 

     o.setVisible(true); 
    } 
} 
+0

在'paint()'中检查复选框的状态。然后根据所选颜色选择颜色。 –

+0

好的,但我应该如何检查它? Canvas类中的复选框的状态是否可见? – whatfor

回答

3

您使用的是Swing标记,以便您的应用程序应该使用Swing组件,而不是AWT组件首先。 Swing组件以“J”开头,但Canvas除外,Swing组件为JPanel。你应该重写paintComponent(...)方法,而不是paint()。

如果你想画不同颜色的物体,那么你有两种选择:

  1. 涂料直接的BufferedImage。当时的形状将与当前选择的颜色

  2. 从包含有关形状的信息的对象的ArrayList涂料被涂,包括尺寸/位置/颜色

对于工作的实施例来绘两种方法都检出Custom Painting Approaches