Должен ли я все еще практиковать Java Swing?
Я пытаюсь добавить функциональность в свое приложение Java Swing Paint, добавив возможность выбора цвета кисти. Однако, когда я заканчиваю выбирать другой цвет в селекторе цвета, все старые метки меняются на этот выбранный цвет вместе с моими новыми линиями. Я хотел, чтобы старые отметины оставались того же цвета, что и раньше.
(Фотографии ниже)
Используя черные чернила. Рисование чего-нибудь.
Решаем изменить цвет на зеленый
И старые, и новые строки станут зелеными.
Это не все приложение (скажи мне, если тебе нужен отдых), но я считаю, что проблема связана с неправильными манипуляциями с таблицей. Таблица "shapeFill", которая сопоставляет цвета с линиями (таблица "формы"), работает некорректно.
public class TestPane extends JComponent{
private List<List<Point>> points;
private ArrayList<Shape> shapes = new ArrayList<Shape>();
public TestPane() {
points = new ArrayList<>(100);
MouseAdapter ma = new MouseAdapter() {
private List<Point> currentPath;
@Override
public void mousePressed(MouseEvent e) {
currentPath = new ArrayList<>(100);
currentPath.add(e.getPoint());
points.add(currentPath);
}
@Override
public void mouseDragged(MouseEvent e) {
Point dragPoint = e.getPoint();
currentPath.add(dragPoint);
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
currentPath = null;
}
};
addMouseListener(ma);
addMouseMotionListener(ma);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
Iterator<Color> fillCounter = shapeFill.iterator();
for(Shape s : shapes) { // I believe problem is somewhere around here?
g2d.setPaint(fillCounter.next());
g2d.setStroke(new java.awt.BasicStroke(10));
}
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (List<Point> path : points) {
Point from = null;
for (Point p : path) {
if (from != null) {
Shape line = new Line2D.Float(from.x, from.y, p.x, p.y);
g2d.draw(line);
shapes.add(line);
shapeFill.add(lineColor);
}
from = p;
}
}
g2d.dispose();
}
}
public JButton createButton(String title) {
JButton button = new JButton(title);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == colorChooser) {
Color chooser = JColorChooser.showDialog(null, "Select color", lineColor);
lineColor = chooser;
shapeFill.add(chooser);
repaint();
}else if (e.getSource() == shapeFillArrayList) {
System.out.print("\n");
for(Color index : shapeFill) {
System.out.println(index);
}
}
}
});
return button;
}
@AndrewThompson Спасибо за полезные ссылки. Я ценю это. Я тоже уже решил свой вопрос.
Варианты выбора - вы также можете сохранить цвет Point и / или Shape, чтобы при вызове paintComponent у вас была вся информация о состоянии, необходимая для воссоздания вывода.
@MadProgrammer Это похоже на то, что я сделал, чтобы исправить свою проблему, хотя я так переработал всю программу, что она больше не похожа на мой исходный код. Спасибо за вашу помощь! Я тут новенький.




Использование
BufferedImageв качестве окрашивающей поверхности могло бы частично решить эту проблему. Вот пример рисования в буферизованное изображение. «Это не все приложение (скажи мне, если тебе нужен отдых)», Нет, нам не нужен дамп всего вашего кода. Сказав это, наибольшее внимание вы получите от меня, основываясь на том, что вы опубликовали, в этом комментарии. Для более быстрой помощи опубликуйте минимальный воспроизводимый пример или Краткий, автономный, правильный пример.