Итак, я пытаюсь создать программу, в которой пользователь может рисовать фигуры на JPanel. Но у меня были проблемы с отображением фигур в порядке. Я придумал плохой способ отображения фигур (только прямоугольников на данный момент) от первого до последнего: размещение каждого прямоугольника в Set
, а затем сохранение целого числа в List
, который определяет цвет прямоугольника и является ли он заполнен или нет. Например, рассмотрим список ниже:Прямоугольники меняются после каждого рисунка
2 - красный прямоугольник, открытый
3 - Красный прямоугольник, заполненный
7 - оранжевый прямоугольник, открытый
8 - оранжевый прямоугольник, заполненный
...
42 - черный прямоугольник, открытый
43 - черный прямоугольник, заполненный
Так если пользователь нарисовать черный прямоугольник, который был открыт, то программа будет сохранить номер 42 в List
, а затем, когда программа переходит обратно рисовать каждый прямоугольник, его Посмотрим на число, соответствующее прямоугольнику, задав цвет и рисунок или заполнив прямоугольник.
Но есть осложнение с этим: скажем, например, я рисую несколько красных прямоугольников, а затем переключаюсь на рисование оранжевых прямоугольников. Иногда, когда я заканчиваю рисование оранжевого прямоугольника, один из прямоугольников, которые я рисовал ранее, станет оранжевым, несмотря на то, что в списке указано соответствующее целое число, указывающее иначе. Я знаю, что это, вероятно, связано с моей ужасной попыткой привести все прямоугольники в порядок, но я не могу придумать никаких других способов сделать это.
Является ли тот факт, что прямоугольники меняют цвет, вытекающие из другой из вещей о живописи, которые я не могу контролировать? Есть ли лучший способ для меня сохранить и перекрасить фигуры в порядок?
public class GraphicsTest {
public GraphicsTest() {
JFrame frame = new JFrame("");
Painter painter = new Painter();
frame.setLayout(new BorderLayout());
frame.setJMenuBar(painter.createMenuBar());
frame.add(painter,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(750,488);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GraphicsTest();
}
});
}
public class Painter extends JPanel implements MouseListener, MouseMotionListener {
private final Color purple = new Color(255,0,255);
private final Color brown = new Color(171,100,28);
private Rectangle dummyRect = new Rectangle(); // Dummy rectangle that shows up when the user attempts to draw a rectangle
private Set<Shape> shapeSet = new HashSet<Shape>();
private List<Color> colorList = new ArrayList<Color>();
private List<Integer> opNumList = new ArrayList<Integer>();
// Point used for drawing dummy rectangle
private Point clickPoint;
// Initial color
private Color color = Color.black;
// int variables that determine the position of various on-screen objects
private int dragX = 0, dragY = 0, downX = 0, downY = 0, upX = 0, upY = 0;
public Painter() {
// Adding colors to the ArrayList
/*colorList.add(Color.red);
colorList.add(Color.orange);
colorList.add(Color.yellow);
colorList.add(Color.green);
colorList.add(Color.blue);
colorList.add(purple);
colorList.add(brown);
colorList.add(Color.white);
colorList.add(Color.black);*/
// Adding listeners so that the mouse may be used to draw various objects
addMouseListener(this);
addMouseMotionListener(this);
}
/**
* Driving method of this program that displays all on-screen components
**/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int index = 0;
Graphics2D g2 = (Graphics2D) g.create();
g2.setColor(color);
// Displaying the rectangle as it is drawn
if (dummyRect.width > 0 && dummyRect.height > 0)
if (cbFillItem.isSelected())
g2.fill(dummyRect);
else
g2.draw(dummyRect);
// Storing the rectangles in the HashSet
if (downX > upX && downY > upY)
shapeSet.add(new Rectangle(upX,upY,downX-upX,downY-upY));
else if (downX > upX && downY < upY)
shapeSet.add(new Rectangle(upX,downY,downX-upX,upY-downY));
else if (downX < upX && downY > upY)
shapeSet.add(new Rectangle(downX,upY,upX-downX,downY-upY));
else
shapeSet.add(new Rectangle(downX,downY,upX-downX,upY-downY));
try {
for (Shape s : shapeSet) {
if (s instanceof Rectangle) {
Rectangle r = (Rectangle) s;
if (r.width == 0 && r.height == 0)
shapeSet.remove(s);
}
}
} catch (ConcurrentModificationException ex) {}
// System.out.println("Size: " + shapeSet.size());
if (!opNumList.isEmpty()) {
for (Shape s : shapeSet) {
//System.out.println("Index: " + index);
//System.out.println("Element: " + opNumList.get(index));
//System.out.println();
switch (opNumList.get(index)) {
case 2: g2.setColor(Color.red); g2.fill(s); break;
case 3: g2.setColor(Color.red); g2.draw(s); break;
case 7: g2.setColor(Color.orange); g2.fill(s); break;
case 8: g2.setColor(Color.orange); g2.draw(s); break;
case 12: g2.setColor(Color.yellow); g2.fill(s); break;
case 13: g2.setColor(Color.yellow); g2.draw(s); break;
case 17: g2.setColor(Color.green); g2.fill(s); break;
case 18: g2.setColor(Color.green); g2.draw(s); break;
case 22: g2.setColor(Color.blue); g2.fill(s); break;
case 23: g2.setColor(Color.blue); g2.draw(s); break;
case 27: g2.setColor(purple); g2.fill(s); break;
case 28: g2.setColor(purple); g2.draw(s); break;
case 32: g2.setColor(brown); g2.fill(s); break;
case 33: g2.setColor(brown); g2.draw(s); break;
case 37: g2.setColor(Color.white); g2.fill(s); break;
case 38: g2.setColor(Color.white); g2.draw(s); break;
case 42: g2.setColor(Color.black); g2.fill(s); break;
case 43: g2.setColor(Color.black); g2.draw(s); break;
default: return;
}
index++;
}
}
}
/**
* MouseListener interface methods
**/
@Override
public void mouseClicked(MouseEvent ev) {}
@Override
public void mouseEntered(MouseEvent ev) {}
@Override
public void mouseExited(MouseEvent ev) {}
@Override
public void mousePressed(MouseEvent ev) {
clickPoint = new Point(ev.getPoint());
upX = ev.getX();
upY = ev.getY();
}
@Override
public void mouseReleased(MouseEvent ev) {
upX = ev.getX();
upY = ev.getY();
if (color == Color.red) {
if (cbFillItem.isSelected())
opNumList.add(2);
else
opNumList.add(3);
}
if (color == Color.orange) {
if (cbFillItem.isSelected())
opNumList.add(7);
else
opNumList.add(8);
}
if (color == Color.yellow) {
if (cbFillItem.isSelected())
opNumList.add(12);
else
opNumList.add(13);
}
if (color == Color.green) {
if (cbFillItem.isSelected())
opNumList.add(17);
else
opNumList.add(18);
}
if (color == Color.blue) {
if (cbFillItem.isSelected())
opNumList.add(22);
else
opNumList.add(23);
}
if (color == purple) {
if (cbFillItem.isSelected())
opNumList.add(27);
else
opNumList.add(28);
}
if (color == brown) {
if (cbFillItem.isSelected())
opNumList.add(32);
else
opNumList.add(33);
}
if (color == Color.white) {
if (cbFillItem.isSelected())
opNumList.add(37);
else
opNumList.add(38);
}
if (color == Color.black) {
if (cbFillItem.isSelected())
opNumList.add(42);
else
opNumList.add(43);
}
repaint();
}
/**
* MouseMotionListener interface methods
**/
@Override
public void mouseMoved(MouseEvent ev) {}
@Override
public void mouseDragged(MouseEvent ev) {
dragX = ev.getX();
dragY = ev.getY();
int minX = Math.min(ev.getX(), clickPoint.x);
int minY = Math.min(ev.getY(), clickPoint.y);
int maxX = Math.max(ev.getX(), clickPoint.x);
int maxY = Math.max(ev.getY(), clickPoint.y);
dummyRect.x = minX;
dummyRect.y = minY;
dummyRect.width = maxX - minX;
dummyRect.height = maxY - minY;
repaint();
}
}
}