2009-05-10 5 views
0

Я делаю программу рисования и имею несколько вопросов относительно этого.Создание программы рисования

Мне нужен пользователь, чтобы иметь возможность рисовать прямоугольник, овал и линию. Полагаю, мне нужно сделать суперкласс, из которого все они происходят. Должен ли я сделать это интерфейсом или абстрактным классом? И как бы я установил, что все фигуры имеют некоторые значения по умолчанию, когда они созданы, например, цвет и т. Д.

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

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

Редактировать: Cheers. Я попробую с несколько легким MVC. У меня есть класс DrawingModel и DrawingPanel, который я создаю в представлении, а затем передаю объект DrawingModel объекту DrawingPanel с помощью метода setModel. Однако возникает один вопрос, который я не могу опустить; какая часть программы должна будет заботиться о слушателях? Я предполагаю, что должен быть реализован View, но где я могу разместить ActionListeners?

+0

Звучит как домашнее задание, вы можете захотеть вернуть его обратно. – willcodejavaforfood

+0

Очевидно, что слушатели должны быть зарегистрированы с частью представления (например, JPanel.addMouseListener), но сами методы слушателя будут частью контроллера. –

ответ

2

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

Ваша область рисования (например, холст или панель или что-то еще) должна реализовать MouseListener и MouseMotionListener для захвата событий мыши. Вы можете узнать, где пользователь нажал, используя методы getX() и getY() MouseEvent. Затем вы можете сохранить эту фигуру в модели и перерисовать() область.

Для масштабирования вам нужно будет использовать методы mouseDragged() и mouseReleased(), которые дадут вам координаты x, y. Вам нужно определить форму, на которую щелкнул пользователь, а затем изменить ее ширину и высоту в зависимости от того, как далеко перетащил пользователь (это можно определить путем вычитания исходного x, y из новых координат x, y).

+0

Я согласен, что это хорошо знать, но/real/MVC, вероятно, переборщит с тем, что звучит как небольшой школьный проект. –

3

Если вы хотите, чтобы все фигуры имели некоторые общие требуемые свойства (и, возможно, методы), абстрактный класс, вероятно, лучший выбор. Вы можете установить их в определении абстрактного класса:

abstract class AbstractShape 
{ 
    private static final Color DEFAULT_COLOR = Color.BLUE; 
    private static final float DEFAULT_LINE_WIDTH = .5f; 

    protected Color color = DEFAULT_COLOR; 
    protected float lineWidth = DEFAULT_LINE_WIDTH; 
} 

class Circle extends AbstractShape 
{ 

} 

EDIT: Просто чтобы прояснить, абстрактный класс может иметь конструктор, такие как:

protected AbstractShape() 
{ 
    color = DEFAULT_COLOR; 
    lineWidth = DEFAULT_LINE_WIDTH 
} 
+0

Лучшей альтернативой предоставлению констант, которые должны быть явно указаны подклассы, является определение конструктора по умолчанию, который обрабатывает это, какие подклассы могут переопределить по мере необходимости. – sooniln

+0

Назначения (color = DEFAULT_COLOR) могут быть легко перенесены в конструктор абстрактного класса, если это необходимо. Однако, с исходным кодом выше, подклассы уже могут свободно переопределять данные экземпляра (color, lineWidth). –

1

Чтобы ответить на ваше изменение: Это представление, которое будет иметь ActionListener, прикрепленный к компонентам. Тогда вы можете получить представление, уведомляющее контроллер (через слушателя), если модель нуждается в обновлении. Когда модель обновляется, она обычно уведомляет контроллер через слушателя изменения свойств, чтобы контроллер мог обновлять представление.

0

Возможно, вы захотите, чтобы у Google DerekBanas было несколько видеороликов, объясняющих, как это сделать. Он также загрузил отличный образец UML, дизайн и другие связанные с объектами ориентированные видео. Я занимаюсь с некоторым кодом за последние пару дней, что немного выходит за рамки его учебных видеороликов, используя другие формы и рисуя лучшие линии с помощью инструмента рисования и т. Д. Если вы хотите проверить код, просто пришлите мне сообщение и я пошлю его вам, но его слишком много, чтобы опубликовать комментарий. Удачи.

Смежные вопросы