Java 2D Graphics Прямоугольники - PullRequest
0 голосов
/ 26 ноября 2009

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 26 ноября 2009

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

6 голосов
/ 26 ноября 2009

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

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

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

0 голосов
/ 26 ноября 2009

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

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

0 голосов
/ 26 ноября 2009

Вы должны переопределить слушатель действия изменения размера окна и вызвать перерисовать внутри него.

...