Java 用额外的颜色为形状着色

Java 用额外的颜色为形状着色,java,colors,drawing,Java,Colors,Drawing,我正在制作一个程序,允许用户在屏幕上绘制多个形状并选择所需的颜色。目前,我有九种预设颜色供用户选择。我计划使用JColorChooser允许用户选择不同的颜色。但是,我无法找到一种方法来存储可以选择的额外颜色,以便在重新绘制绘制的形状时,它们将保持与绘制时相同的颜色 我想出了一种方法,按照绘制顺序和颜色重新绘制形状,如下所示: private List<Shape> shapeList = new ArrayList<Shape>(); private List<I

我正在制作一个程序,允许用户在屏幕上绘制多个形状并选择所需的颜色。目前,我有九种预设颜色供用户选择。我计划使用
JColorChooser
允许用户选择不同的颜色。但是,我无法找到一种方法来存储可以选择的额外颜色,以便在重新绘制绘制的形状时,它们将保持与绘制时相同的颜色

我想出了一种方法,按照绘制顺序和颜色重新绘制形状,如下所示:

private List<Shape> shapeList = new ArrayList<Shape>();
private List<Integer> opNumList = new ArrayList<Integer>();

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int index = 0;
    Graphics2D g2 = (Graphics2D) g.create();

    if (!opNumList.isEmpty()) {
        for (Shape s : shapeList) {
            switch (opNumList.get(index))
                case  0: g2.setColor(Color.red);    g2.draw(s); break;
                case  1: g2.setColor(Color.red);    g2.fill(s); break;
                case  2: g2.setColor(Color.orange); g2.draw(s); break;
                case  3: g2.setColor(Color.orange); g2.fill(s); break;
                case  4: g2.setColor(Color.yellow); g2.draw(s); break;
                case  5: g2.setColor(Color.yellow); g2.fill(s); break;
                case  6: g2.setColor(Color.green);  g2.draw(s); break;
                case  7: g2.setColor(Color.green);  g2.fill(s); break;
                case  8: g2.setColor(Color.blue);   g2.draw(s); break;
                case  9: g2.setColor(Color.blue);   g2.fill(s); break;
                case 10: g2.setColor(purple);       g2.draw(s); break;
                case 11: g2.setColor(purple);       g2.fill(s); break;
                case 12: g2.setColor(brown);        g2.draw(s); break;
                case 13: g2.setColor(brown);        g2.fill(s); break;
                case 14: g2.setColor(Color.white);  g2.draw(s); break;
                case 15: g2.setColor(Color.white);  g2.fill(s); break;
                case 16: g2.setColor(Color.black);  g2.draw(s); break;
                case 17: g2.setColor(Color.black);  g2.fill(s); break;
                default: return;
            }
            index++;
        }
    }
}

@Override
public void mouseReleased(MouseEvent ev) {
    if (color == Color.red) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(0);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(1);
    }

    if (color == Color.orange) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(2);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(3);
    }

    if (color == Color.yellow) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(4);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(5);
    }

    if (color == Color.green) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(6);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(7);
    }

    if (color == Color.blue) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(8);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(9);
    }

    if (color == purple) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(10);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(11);
    }

    if (color == brown) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(12);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(13);
    }

    if (color == Color.white) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(14);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(15);
    }

    if (color == Color.black) {
        if (toolNum == LINE || (toolNum == RECTANGLE && !cbFillItem.isSelected()) || (toolNum == OVAL && !cbFillItem.isSelected()))
            opNumList.add(16);
        if ((toolNum == RECTANGLE || toolNum == OVAL) && cbFillItem.isSelected())
            opNumList.add(17);
    }
    repaint();
}
private List shapeList=new ArrayList();
private List opNumList=new ArrayList();
@凌驾
受保护组件(图形g){
超级组件(g);
int指数=0;
Graphics2D g2=(Graphics2D)g.create();
如果(!opNumList.isEmpty()){
对于(形状s:形状列表){
开关(opNumList.get(索引))
案例0:g2.setColor(Color.red);g2.draw(s);break;
案例1:g2.setColor(颜色为红色);g2.fill(s);break;
案例2:g2.setColor(颜色为橙色);g2.draw(s);break;
案例3:g2.setColor(颜色为橙色);g2.fill(s);break;
案例4:g2.setColor(颜色为黄色);g2.draw(s);break;
案例5:g2.setColor(颜色为黄色);g2.fill(s);break;
案例6:g2.setColor(Color.green);g2.draw(s);break;
案例7:g2.setColor(Color.green);g2.fill(s);break;
案例8:g2.setColor(Color.blue);g2.draw(s);break;
案例9:g2.setColor(Color.blue);g2.fill(s);break;
案例10:g2.setColor(紫色);g2.draw(s);break;
案例11:g2.setColor(紫色);g2.fill(s);break;
案例12:g2.setColor(棕色);g2.draw(s);break;
案例13:g2.setColor(棕色);g2.fill(s);break;
案例14:g2.setColor(Color.white);g2.draw(s);break;
案例15:g2.setColor(Color.white);g2.fill(s);break;
案例16:g2.setColor(Color.black);g2.draw(s);break;
案例17:g2.setColor(颜色为黑色);g2.fill(s);break;
默认:返回;
}
索引++;
}
}
}
@凌驾
公共无效MouseEvent ev(MouseEvent ev){
如果(颜色==color.red){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(0);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(1);
}
如果(颜色==color.orange){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(2);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(3);
}
如果(颜色==颜色.黄色){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(4);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(5);
}
if(color==color.green){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(6);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(7);
}
if(color==color.blue){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(8);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(9);
}
如果(颜色==紫色){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(10);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(11);
}
如果(颜色==棕色){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(12);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(13);
}
如果(颜色==颜色.白色){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(14);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(15);
}
如果(颜色==颜色.黑色){
if(toolNum==行| | |(toolNum==矩形&&!cbFillItem.isSelected())| |(toolNum==椭圆&&!cbFillItem.isSelected())
opNumList.add(16);
if((toolNum==RECTANGLE | | toolNum==OVAL)&&cbFillItem.isSelected())
opNumList.add(17);
}
重新油漆();
}
因此,当用户绘制形状时,它存储在
shape
对象的
ArrayList
中。根据绘制的形状类型及其颜色,整数存储在单独的列表中。然后,当程序重新绘制所有形状时,它将遍历列表中的每个形状,并为这些形状提供绘制时使用的颜色,必要时将其填充

现在,我想找出一种方法,将这些颜色转移到它们自己的
列表中,或者甚至是一张
地图中,以避免创建大量的
颜色对象并添加到已经很长的代码列表中,这样,如果用户决定使用其他颜色,程序将知道什么颜色属于wha
Map<Shape,Color> map = new HashMap<Shape,Color>();
for (Entry<Shape,Color> entry : map.entrySet()) {
    Shape shape = entry.getKey();
    Color color = entry.getValue();

    g2.setColor(color);
    g2.draw(shape);
}
Map<Shape,Color> map = new LinkedHashMap<Shape,Color>();
int index = 0;
for (Entry<Shape,Color> entry : map.entrySet()) {
    Shape shape = entry.getKey();
    Color color = entry.getValue();

    g2.setColor(color);
    if (!opNumList.isEmpty()) {
        if (opNumList.get(index) == 0)
            g2.draw(shape);
        if (opNumList.get(index) == 1)
            g2.fill(shape);
    }
    index++;
}