添加到具有不同图形对象的arraylist

时间:2015-04-30 04:03:41

标签: java arraylist paintcomponent

我有绘制矩形的程序,但是当我更改图形对象(鼠标)的颜色时,它也会改变所有颜色。我是否必须制作另一个arraylist或是否可以添加到现有的arraylist。

public class Rectangles extends JPanel {
private JRadioButton red, black;
private Color c;
private ArrayList<Point> points;

public  Rectangles() {
    setLayout(new FlowLayout());
    setBackground(Color.white);
    JPanel pane = new JPanel();
    pane.setBackground(Color.gray);
    points = new ArrayList<Point>();
    addMouseListener(new MovementListener());
    red = new JRadioButton("Red");
    black = new JRadioButton("Black");
    red.addActionListener(new ChangeColorListener());
    black.addActionListener(new ChangeColorListener());
    ButtonGroup group = new ButtonGroup();
    group.add(red);
    group.add(black);
    red.setBackground(Color.red);
    black.setBackground(Color.black);
    add(pane);
    pane.add(red);
    pane.add(black);

}

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(c);

    for (int i = 0; i < points.size(); i++) {

        Point p = points.get(i);

        g.drawRect(p.x, p.y, 15, 15);

    }

}

private class MovementListener extends MouseInputAdapter {
    public void mouseClicked(MouseEvent ex) {

        addMouseMotionListener(new MovementListener());

    }

    public void mouseMoved(MouseEvent ex) {

        Point point = ex.getPoint();
        points.add(point);

        repaint();

    }
}

private class ChangeColorListener implements ActionListener {
    public void actionPerformed(ActionEvent ex) {

        if (ex.getSource() == red) {
            c = Color.red;
        } else if (ex.getSource() == black) {

            c = Color.black;

        }
    }
}

1 个答案:

答案 0 :(得分:0)

将来可能需要为这些对象添加其他属性。我建议为此创建另一个类。

class MyPoint {
     // if the values would be unchangeable make them final
     private Point point;
     private Color color;

     public MyPoint(Point point, Color color) {
         this.point = point;
         this.color = color;
     }

     // getters
}

同样是一个小建议,在构造函数中你应该只设置参数。在你的情况下,我将创建一个名为&#34; init()&#34;并创建所有面板等。