Проблема с изменением цвета в моем приложении Java Swing Paint

  1. Должен ли я все еще практиковать Java Swing?

  2. Я пытаюсь добавить функциональность в свое приложение 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;
}

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

Andrew Thompson 09.08.2018 06:09

@AndrewThompson Спасибо за полезные ссылки. Я ценю это. Я тоже уже решил свой вопрос.

nate 09.08.2018 06:58

Варианты выбора - вы также можете сохранить цвет Point и / или Shape, чтобы при вызове paintComponent у вас была вся информация о состоянии, необходимая для воссоздания вывода.

MadProgrammer 09.08.2018 06:59

@MadProgrammer Это похоже на то, что я сделал, чтобы исправить свою проблему, хотя я так переработал всю программу, что она больше не похожа на мой исходный код. Спасибо за вашу помощь! Я тут новенький.

nate 09.08.2018 07:04
«Я тоже решил свой вопрос» Рад, что вы разобрались. :)
Andrew Thompson 09.08.2018 12:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
39
0

Другие вопросы по теме