Рисование свободной рукой на JFrame, Color + Point[] Ошибка хранения и рендеринга

Предполагается, что следующая программа позволяет рисовать от руки на одном кадре, а в другом - в качестве кнопки для открытия селектора цвета. Код для основного класса можно найти:

package clickTesting;

import Desksnap.Utils.Line;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.LinkedList;
import java.util.List;


public class Main {
    public static Color currentColor = null;

    public static void main(String[] args) {
        Viewer gui = new Viewer();
        button gui1 = new button();
        gui.setVisible(true);
        gui1.setVisible(true);
        boolean lol = true;
        while (lol) {
            gui.repaint(500);
        }
    }


    static class Viewer extends JFrame implements MouseMotionListener, MouseListener {
        public List<Line> lines = new LinkedList<Line>();
        private int index = 0;
        private Point[] arr = new Point[100000];

        public Viewer() {
            addMouseListener(this);
            addMouseMotionListener(this);
        }

        private void initComponents() {
            PhotoWindow = new JFrame();
            setUndecorated(true);
            {
                Container PhotoWindowContentPane = PhotoWindow.getContentPane();
                PhotoWindowContentPane.setLayout(null);
                PhotoWindowContentPane.setPreferredSize(new Dimension(410, 539));
                PhotoWindow.pack();
                PhotoWindow.setLocationRelativeTo(PhotoWindow.getOwner());
                addMouseListener(this);


            }
        }

        private JFrame PhotoWindow;


        @Override
        public void mousePressed(MouseEvent e) {
            arr[index] = new Point(e.getX(), e.getY());
            index++;
            System.out.println(index);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            lines.add(new Line(Main.currentColor, arr));
            arr = new Point[100000];
            index = 0;
            System.out.println("Released");
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            arr[index] = new Point(e.getX(), e.getY());
            index++;
            System.out.println(index);
        }


        @Override
        public void paint(Graphics g) {
            super.paintComponents(g);
            if (lines.size() >= 0) {
                for (Line z : lines) {
                    if (z != null) {
                        Point[] lel = z.getLine();
                        g.setColor(z.getColor());
                        if (lel != null) {
                            for (int i = 0; i < lel.length; i++)
                                if (lel[i] != null) {
                                    g.drawLine(lel[i].x, lel[i].y, lel[i + 1].x, lel[i + 1].y);
                                }
                        } else {
                            System.out.println("Nope");
                        }
                    }
                }
            } else {
                System.out.println("Nothing In List Yet!");
            }
        }


        //Unused
        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseMoved(MouseEvent e) {
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }
    }


    public static class button extends JFrame implements MouseMotionListener, MouseListener {
        public button() {
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
        }

        private void initComponents() {
            PhotoWindow = new JFrame();
            setUndecorated(true);
            {
                Container PhotoWindowContentPane = PhotoWindow.getContentPane();
                PhotoWindowContentPane.setLayout(null);
                PhotoWindowContentPane.setPreferredSize(new Dimension(410, 539));
                PhotoWindow.pack();
                PhotoWindow.setLocationRelativeTo(PhotoWindow.getOwner());
                addMouseListener(this);
            }
        }

        private JFrame PhotoWindow;


        @Override
        public void mousePressed(MouseEvent e) {
            JColorChooser color = new JColorChooser();
            Main.currentColor = color.showDialog(
                    button.this,
                    "Choose Background Color",
                    Color.BLACK);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseDragged(MouseEvent e) {
        }

        @Override
        public void mouseMoved(MouseEvent e) {
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }
    }
}

Этот класс поддерживает рисование, запись линий и основной цикл:

package Desksnap.Utils;

import java.awt.*;
import java.util.*;
import java.util.List;


public class Line {
    Color color = null;
    Point[] points = null;

 public Line(Color color, Point[] points){
     color = this.color;
     points = this.points;
 }

    public Color getColor(){
        return color;
    }
    public Point[] getLine(){
        return points;
    }


}

Это используемый класс линии.

После рисования линии программа просто печатает "Нет" в консоли.

Выход: Нет х 10000000

Пожалуйста, помогите мне понять, что я сделал не так.

1 ответ

Решение

Для начала, НИКОГДА не делайте этого...

while (lol) {
    gui.repaint(500);
}

Вы не контролируете процесс рисования, то есть домен RepaintManager, Если вы хотите обновить свой компонент, используйте repaint ОДИН РАЗ и пусть RepaintManager понять это.

Суть вашей проблемы здесь...

public Line(Color color, Point[] points) {
    color = this.color;
    points = this.points;
}

Вы присваиваете значения this.color в color а также this.points в points, который не имеет никакого эффекта. Вы должны назначить их наоборот (color в this.color)

Вы также захотите поближе взглянуть на:

призвание super.paintComponents изнутри paint это плохая идея, вы должны звонить super.paint и пусть он позаботится о соответствующих вызовах краски.

На самом деле, вы не должны переопределять paint без действительно веской причины, особенно контейнеров верхнего уровня. Вместо этого начните с расширения вашего класса рисования с JPanel и переопределить это paintComponent метод вместо.

Затем вы можете добавить этот компонент в любой нужный вам контейнер.

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