Как работает руководство по рисованию в этой программе рисования Java?

В настоящее время я делаю программу рисования, в которой мы рисуем квадраты, где они должны рисовать, когда пользователь перетаскивает мышь. Мой профессор научил нас этому в графическом режиме XOR.

Я нашел этот код, и он выглядит намного эффективнее. Я смущен тем, как работает руководство, как оно написано для меня, когда они перетаскивают мышь. Это просто создаст кучу разных прямоугольников, и все они останутся на экране.

Как получается, что прямоугольник постоянно обновляется для мыши пользователя, но не остается на экране?

Это потому, что форма не добавляется к ArrayList?

public DrawingBoard() {
    this.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            // When the mouse is pressed get x & y position
            drawStart = new Point(e.getX(), e.getY());
            drawEnd = drawStart;
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // Create a shape using the starting x & y
            // and finishing x & y positions
            Shape aShape = drawRectangle(drawStart.x, drawStart.y, e.getX(), e.getY());

            // Add shapes, fills and colors to there ArrayLists
            shapes.add(aShape);
            shapeFill.add(fillColor);
            shapeStroke.add(strokeColor);

            drawStart = null;
            drawEnd = null;

            // repaint the drawing area
            repaint();
        }
    });

    this.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            // Get the final x & y position after the mouse is dragged
            drawEnd = new Point(e.getX(), e.getY());
            repaint();
        }
    });
}

public void paint(Graphics g) {
    // Class used to define the shapes to be drawn
    Graphics2D graphSettings = (Graphics2D) g;

    // Antialiasing cleans up the jagged lines and defines rendering rules
    graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
            RenderingHints.VALUE_ANTIALIAS_ON);

    // Defines the line width of the stroke
    graphSettings.setStroke(new BasicStroke(2));

    // Iterators created to cycle through strokes and fills
    Iterator<Color> strokeCounter = shapeStroke.iterator();
    Iterator<Color> fillCounter = shapeFill.iterator();

    // Eliminates transparent setting below
    graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));

    for (Shape s : shapes) {
        // Grabs the next stroke from the color arraylist
        graphSettings.setPaint(strokeCounter.next());
        graphSettings.draw(s);

        // Grabs the next fill from the color arraylist
        graphSettings.setPaint(fillCounter.next());
        graphSettings.fill(s);
    }

    // Guide shape used for drawing
    if (drawStart != null && drawEnd != null) {
        // Makes the guide shape transparent
        graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.40f));

        // Make guide shape gray for professional look
        graphSettings.setPaint(Color.LIGHT_GRAY);

        // Create a new rectangle using x & y coordinates
        Shape aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y);
        graphSettings.draw(aShape);
    }

}

person J.Ramsey    schedule 30.03.2018    source источник
comment
Похоже, они перерисовывают весь кадр при каждом движении мыши — обратите внимание на вызовы repaint();. Не уверен, что это более эффективно, чем XOR.   -  person Johnny Mopp    schedule 30.03.2018
comment
В коде тоже есть проблемы -- 1) paintComponent следует переопределить, а не paint, 2) в переопределении должен вызываться метод рисования супера   -  person Hovercraft Full Of Eels    schedule 30.03.2018
comment
I am confused as to how the guide works - я тоже. Судя по предоставленному коду, это не должно работать, так как фон панели не очищается каждый раз, когда вызывается метод рисования, поэтому вы должны увидеть кучу разных прямоугольников. У вас должен отсутствовать код. В любом случае это не лучший пример для подражания. Я бы посоветовал вам ознакомиться с Подходы к рисованию на заказ он правильно рисует. Ключом является super.paintComponent(...), который очищает фон до того, как все прямоугольники будут перекрашены.   -  person camickr    schedule 30.03.2018


Ответы (1)


Код будет хранить все прямоугольники, созданные пользователем. Если вам нужен один прямоугольник на экране, вы можете нарисовать прямоугольник, не сохраняя его в массиве. удалить все коды, связанные с массивом.

person YCXU1993    schedule 30.03.2018