Рисование свободной рукой на 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
)
Вы также захотите поближе взглянуть на:
- Использование нескольких JFrames, хорошая / плохая практика?
- Живопись в AWT и Swing
- Выполнение Пользовательской Живописи
призвание super.paintComponents
изнутри paint
это плохая идея, вы должны звонить super.paint
и пусть он позаботится о соответствующих вызовах краски.
На самом деле, вы не должны переопределять paint
без действительно веской причины, особенно контейнеров верхнего уровня. Вместо этого начните с расширения вашего класса рисования с JPanel
и переопределить это paintComponent
метод вместо.
Затем вы можете добавить этот компонент в любой нужный вам контейнер.