Рисование на JPanel'e

439
07 января 2017, 13:15

Доброго времени суток! Пишу программу похожую на MSPaint для проекта. Вот ссылка на репозиторий с полным проектом -> https://github.com/ALazyGuy/LTP/tree/master/com/LTP/Paint. Суть вот в чем: сейчас добавляю прорисовку прямоугольника. Вот что есть:

package com.LTP.Paint;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
import com.LTP.Paint.objects.Tools;
public class Paint extends JPanel {
    public static Tools tool = Tools.PEN;
    public static Color selectedColor = Color.YELLOW;
    public static Color temp = selectedColor;
    public static int size = 2;
    public Paint(){
        setSize(800, 600);
        addMouseListener(new Listener(this));
        addMouseMotionListener(new Listener(this));
        grabFocus();
    }
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 800, 600);
    }
}
class Listener implements MouseListener, MouseMotionListener{
    private Paint paint;
    public Listener(Paint paint){
        this.paint = paint;
    }
    public void mouseDragged(MouseEvent e) {
        mouseClicked(e);
    }
    public void mouseClicked(MouseEvent e) {
        if((Paint.tool == Tools.PEN)){
            Graphics g = paint.getGraphics();
            g.setColor(Paint.selectedColor);
            g.fillRect((int)(e.getX() - (Paint.size / 2)), (int)(e.getY() - (Paint.size / 2)), Paint.size, Paint.size);
        }
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }
    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
}

Реализовать прорисовку хочу так:

1) Добавить переменные int x, y в класс Listener.

2) Метод mousePressed реализовать так:

public void mousePressed(MouseEvent e){
    x = e.getX();
    y = e.getY();
    /* А тут каким-то на данный момент неизвесным мне способом,
    сохранить текущее состояние моей панели. Так, что бы 
    потом, я мог просто нарисавать это состояние. Например в переменной
    BufferedImage добавленной в классе Listener.*/
}

3) Метод mouseDragged реализовать как-то так:

public void mouseDragged(MouseEvent e){
    if(Paint.tool == Tools.RECTANGLE){
        //На месте этого коментария рисую то сохраненное состояние на панели
        Graphics g = paint.getGraphics();
        g.setColor(Paint.selectedColor);
        g.fillRect(x, y, e.getX() - x, e.getY() - y);

    }
}

4) Метод mouseReleased реалезую так же как и mouseDragged, но не рисую состояние панели.

Внимание вопрос! Как сохранить, а затем нарисовать это "Состояние"?

READ ALSO
Получение и обработка данных из таблицы в .jsp файле

Получение и обработка данных из таблицы в .jsp файле

Здравствуйте, коллегиПытаюсь решить задачу, но, как всегда, мешает отсутствие опыта

405
Как работает if для булевого значения

Как работает if для булевого значения

Почему выводит результат true,false,false,true,true? По какой логике? Я так понимаю, if (example[i]) означает, что если данный элемент равен любому значению,...

403
Как правильно использовать mock из Mockito

Как правильно использовать mock из Mockito

Есть класс который я хочу протестировать, но когда я использую mock у меня не получается нормальной замены, то есть результирующий метод в классе...

386
Как правильно поменять сцену в живых обоях

Как правильно поменять сцену в живых обоях

Как сделать так, чтобы при изменении настроек, сцены менялись и работали без проблем?

315