2009-11-26 6 views
0

Я пытаюсь создать Java-апплет, который позволит мне нарисовать структуру данных графа в холсте. Я сделаю это, щелкнув, где я хочу создавать узлы, и щелкнув узлы, чтобы их соединить. Проблема в том, что я не могу заставить метод paint() правильно вести себя. Добавить новые узлы в графе (и квадраты на холсте) внутри метода mousePressed(MouseEvent e) с использованием,Java 2D Graphics Rectangles

Graphics g = this.getGraphics(); 
g.setColor(Color.blue); 
g.fillRect(e.getX(), e.gety(), 40, 40); 

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

Как использовать g.fillRect() в методах прослушивания мыши и заставить их придерживаться?

ответ

6

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

Вот как создать и привлечь к изображению:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

Затем в методе краски, использовать свой метод Graphics' DrawImage (...), чтобы отобразить изображение, которое вы создали.

+0

Это казалось самым простым методом, я создал новый BufferedImage, а затем нарисовал все свои фигуры на нем и просто сделал метод рисования рисуем изображение. Благодаря! – PherricOxide

+1

Нет проблем, хотя вам, возможно, придется полностью перекрасить, в конце концов вспомнить совет Кила. (также, не забудьте проголосовать и «принять» ответы, которые вам нравятся. Мне нужны мои точки кармы. :) – Gunslinger47

+1

В этом конкретном случае сохранение данных, вероятно, будет гораздо лучше, чем буферизованное изображение. Однако +1 для получения обеих крайностей. –

6

Я не знаю, если я правильно читать это, но почему бы не только сохранить расположение последнего клика в переменной окрашиваться позже, когда вызывается метод paint()?

+0

Это правильный ответ. 'mousePressed()' не нужно делать какую-либо собственную картину; он должен просто называть 'repaint' и сохранять необходимую информацию, чтобы' paint() 'могла выполнять свою работу. –

+0

Разве мне не нужно было бы хранить места всех щелчков где-нибудь и проходить через этот список, когда я перекрашу? Я понимаю, что paint() начинается с пустого холста и идет оттуда. – PherricOxide

+1

@PherricOxide: Да, вы бы это сделали. Однако вам придется делать это независимо от того, какое решение вы выберете. Вы не можете просто предположить, что холст не должен быть перекрашен. – kylc

0

Графика временная. Когда регион загрязнится, он будет перекрашен.

Лучший способ создать BufferedImage, нарисовать его на mousePressed и переименовать.
Когда вызывается краска, нарисуйте изображение на переданный графический объект. Таким образом вам не нужно сохранять Rectangles, и у вас есть буфер, который улучшит производительность.