Сейчас я делаю что-то вроде «Paint» с компонентами Swing. Он может рисовать только эллипсы, прямоугольники и линии. Проблема в том, что каждый раз, когда я меняю цифры, другие цифры не останутся на JPanel. Например, остаются все фигуры одного типа: если я начну рисовать линии, они останутся в JPanel, пока я не изменит рисунок. Каждая фигура, которую я рисую, сохраняется в классе, где я определил атрибуты:

  • Начальная точка
  • LastPoint
  • TypeOfFigure
  • OutLineColor
  • FillingColor

И каждый объект этого класса сохраняется в ArrayList. Как я могу перерисовывать элементы этого массива каждый раз, когда меняю цифры? Вот мой метод draw ()

private void draw() {
        mMouseIsDragging = false;
        mMouseReleased = false;
        MyPanel.this.addMouseListener(new MouseAdapter() {
            private Coordenadas mDraw;
            @Override
            public void mousePressed(MouseEvent e) {
                mCoordenadas.add(new Coordenadas());
                mDraw = (Coordenadas) MyPanel.this.mCoordenadas.get(MyPanel.this.mCoordenadas.size() - 1);
                mDraw.setColor(mColorLinea);
                mDraw.setColorRelleno(mColorRelleno);
                mDraw.setTipo(mOpcion);
                mStartPoint = e.getPoint();
                mDraw.setFirstPoint(e.getPoint());
                mMouseIsDragging = true;
           }
            @Override
            public void mouseReleased(MouseEvent e) {
                mDraw = (Coordenadas) MyPanel.this.mCoordenadas.get(MyPanel.this.mCoordenadas.size() - 1);
                mPuntoFinal = e.getPoint();
                mDraw.setLastPoint(e.getPoint());
                mMouseReleased = true;
                mMouseIsDragging = false;
                repaint();
            }
        });
        MyPanel.this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mPuntoFinal = e.getPoint();
                mMouseReleased = false;
                mMouseIsDragging = true;
                repaint();
            }
        });
    }

И это части метода paintComponent, которые рисуют эти фигуры:

if (mMouseReleased == true && mMouseIsDragging == false) {
            for (int i = 0; i < mCoordenadas.size(); i++) {
                Coordenadas mCoord = (Coordenadas) mCoordenadas.get(i);
                switch (mCoord.getTipo()) {
                    case 1:
                        mG2D.setColor(mCoord.getColor());
                        mG2D.drawLine(mCoord.getFirstPoint().x, mCoord.getFirstPoint().y, mCoord.getLastPoint().x, mCoord.getLastPoint().y);
                        break;
                    case 2:
                        if (mCoord.getColorRelleno() != null) {
                            mG2D.setPaint(mCoord.getColorRelleno());
                            mG2D.fill(new Rectangle2D.Double(mCoord.getFirstPoint().x, mCoord.getFirstPoint().y, Math.abs(mCoord.getFirstPoint().x - mCoord.getLastPoint().x), Math.abs(mCoord.getFirstPoint().y - mCoord.getLastPoint().y)));
                        } else {
                            mG2D.setColor(mCoord.getColor());
                            mG2D.drawRect(mCoord.getFirstPoint().x, mCoord.getFirstPoint().y, Math.abs(mCoord.getFirstPoint().x - mCoord.getLastPoint().x), Math.abs(mCoord.getFirstPoint().y - mCoord.getLastPoint().y));
                        }
                        break;
                    case 3:
                        if (mCoord.getColorRelleno() != null) {
                            mG2D.setPaint(mCoord.getColorRelleno());
                            mG2D.fill(new Ellipse2D.Double(mCoord.getFirstPoint().y, mCoord.getFirstPoint().x, mCoord.getLastPoint().x, mCoord.getLastPoint().y));
                        } else {
                            mG2D.setColor(mCoord.getColor());
                            mG2D.drawOval(mCoord.getFirstPoint().x, mCoord.getFirstPoint().y, mCoord.getLastPoint().x, mCoord.getLastPoint().y);
                        }
                        break;
                }
            }
        }
if (mMouseReleased == false && mMouseIsDragging == true) {
            if (mColorRelleno != null) {
                mG2D.setBackground(mColorRelleno);
            } else {
                mG2D.setColor(mColorLinea);
            }
            switch (mOpcion) {
                case 1:
                    mG2D.drawLine(mPuntoInicio.x, mPuntoInicio.y, mPuntoFinal.x, mPuntoFinal.y);
                    break;
                case 2:
                    mG2D.drawRect(mPuntoInicio.x, mPuntoInicio.y, Math.abs(mPuntoInicio.x - mPuntoFinal.x), Math.abs(mPuntoInicio.y - mPuntoFinal.y));
                    break;
                case 3:
                    mG2D.drawOval(mPuntoInicio.x, mPuntoInicio.y, mPuntoFinal.x, mPuntoFinal.y);
                    break;
            }
        }

Извините за смешивание английского и испанского здесь, я только что сделал это D: Первый, если входит, когда мышь отпущена и не тянет явно, но почему-то, когда я переключаю цифры, он не рисует фигуры, которые находятся внутри массива, который в этот случай - mCoordenadas. Как я могу запустить это в другой теме? Или лучше выразиться, нужна ли мне нить, чтобы справиться с этим?

0
René Vidriales Trujillo 24 Апр 2017 в 06:46

2 ответа

Лучший ответ

Представьте себе художника, работающего на холсте. Время от времени он хватает ведро с краской и выливает его на холст. Все, что было раньше ... "исчезает".

Это то, что вы делаете при звонке

mG2D.fill(new Rectangle2D.Double(mCoord.getFirstPoint().x, ...                         

В вашем методе paintComponent ().

Дело в том, что у вас есть определенное (сложное) состояние; и то, что происходит в основном: всякий раз, когда правильные условия объединяются, вы заполняете свой холст; тем самым «перезаписывая» любой предыдущий контент.

Кроме того: это, вероятно, хороший пример СУХОЙ принципа: у вас есть такой же код в разных местах; и потерял след этого.

Вместо этого: убедитесь, что все, что должен делать ваш код, записано в ровно в одном месте.

Другими словами: у вас не должно быть нескольких звонков для заполнения. Вместо этого: отступите назад и определите «блоки общего поведения» - и извлеките их в метод.

1
GhostCat 24 Апр 2017 в 06:57

Или лучше выразиться, нужна ли мне нить, чтобы справиться с этим?

Темы не имеют к этому никакого отношения.

mCoordenadas.add(new Coordenadas());

Не добавляйте новую панель. Вся покраска должна быть выполнена на одной панели.

ArrayList должен содержать общий объект shape. Таким образом, ArrayList может содержать формы эллипса, прямоугольника и линии. Каждая «фигура» должна уметь рисовать сама.

Что может измениться при переключении фигур - это логика MouseListener. Вы можете удалить старого слушателя и добавить нового слушателя для вновь выбранной фигуры.

это не рисует цифры, которые находятся внутри arraylist,

Другой вариант - рисовать непосредственно в BufferedImage, тогда вам не нужно беспокоиться о перерисовке объектов.

Ознакомьтесь с пользовательскими подходами к рисованию, чтобы ознакомиться с примерами работы обоих подходов. : 1) рисование из ArrayList и 2) рисование в BufferedImage.

1
camickr 24 Апр 2017 в 03:53
43579463