Java 2D Graphics Прямоугольники
Вопрос
Я пытаюсь создать 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 ()
внутри методов прослушивателя мыши и заставить их придерживаться?
Решение
Проблема в том, что место, куда вы рисуете, не является постоянным. В любой момент вы можете потерять все, что вы к нему потянули. Метод paint (Graphics) вызывается, когда это происходит. Вам нужно будет либо перерисовывать всю картинку каждый раз, когда это происходит, либо вам нужно отложить холст для рисования и копирования содержимого графика вашего апплета по мере необходимости.
Вот как можно создать и нарисовать изображение: Затем в своем методе рисования используйте метод DrawImage (...) для Graphics, чтобы отобразить созданное вами изображение.
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html а> р>
Другие советы
Я не знаю, правильно ли я читаю, но почему бы просто не сохранить местоположение последнего щелчка в переменной, которая будет нарисована позже, когда вызывается метод paint ()?
Вы должны переопределить слушатель действия изменения размера окна и вызвать перекрасить внутри него.
Графика временная. Когда область испачкается, она будет перекрашена.
Лучший способ - создать BufferedImage, нарисовать его на mousePressed и вызвать перерисовку.
Когда вызывается краска, нарисуйте изображение на переданный графический объект. Таким образом, вам не нужно хранить прямоугольники, и вы получите буфер, который улучшит производительность.