2014-10-30 39 views
1

我正在制作一个程序,允许用户在屏幕上绘制多个形状并选择所需的颜色。目前,我有9种预设颜色供用户选择。我打算使用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(); 
} 

那么会发生什么情况是,当用户绘制一个形状,它存储在Shape对象的ArrayList中。一个整数存储在一个单独的列表中,基于绘制了什么样的形状及其颜色。然后,当程序重新绘制所有形状时,它将遍历列表中的每个形状,并且它将为这些形状提供它们所绘制的颜色,并在必要时填充它们。现在

,正是我试图找出一种方法来这些颜色甚至Map转移到自己的List也许,以避免产生一吨Color对象,并增加了已经很长的代码列表,以便如果用户决定使用其他颜色,该程序将知道什么颜色属于哪种形状。例如,如果用户决定用128,128,128的颜色绘制填充矩形,当程序重新绘制形状时,它会知道该矩形已填充,并被着色为特定的灰色阴影。但我还没有走得那么远;现在我正试图找到一种解决方案,可以用于目前我所拥有的九种颜色。

有没有人有任何想法如何做到这一点?

回答

0

它花了一些研究和环顾四周,但我终于找到了解决问题的办法。

起初,我想过使用一个Map这样我就可以添加一个键值对,只要我能访问所有地图的键(即实现Shape接口的对象),我将能够配对他们与他们的值(Color对象)很容易。所以我想出了这个:

Map<Shape,Color> map = new HashMap<Shape,Color>(); 

而这使我可以存储用户绘制的任何形状以及使用相应的颜色。但现在我必须找到一种方法来使用for循环来检索所有存储的形状,以便重新绘制它们。做了一点研究,我碰到了this answer,它展示了如何使用所述循环迭代Map。所以,我是能够取代switch声明与此:

for (Entry<Shape,Color> entry : map.entrySet()) { 
    Shape shape = entry.getKey(); 
    Color color = entry.getValue(); 

    g2.setColor(color); 
    g2.draw(shape); 
} 

不过,我遇到了另一个问题:该键值配对不是为了,这意味着一些形状会随机出现在别人的顶部,当他们之前在他们后面,反之亦然。因此,更多的研究帮助我决定,我应该改为使用LinkedHashMap相反,它保留在该键值配对存储顺序:帮我认识到

Map<Shape,Color> map = new LinkedHashMap<Shape,Color>(); 

,有点试验和错误的,因为键值对保证按顺序排列,我始终可以使用opNumList来确定给定的形状是否应绘制为打开或填充。

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++; 
}