2013-08-01 2 views
4

Надеюсь, этот вопрос не будет считаться слишком общим. Я понимаю, что для рисования на JPanel вы переопределите метод paintComponent и поместите весь свой код чертежа в этот метод. Мой вопрос - почему! Почему Java, похоже, не позволяет/не обеспечивает рисование с помощью таких методов, как panel.drawLine(x1,y1,x2,y2) или panel.drawText(text,x,y)? В дельфи было гораздо проще. Должна быть причина, по которой я просто не могу понять.Почему нужно использовать метод paintComponent для рисования на Java?

ответ

10

Это потому, что так оно и работает. Он был разработан таким образом. Но я думаю, ваш вопрос о «почему»

Помните, что Swing впервые появился почти 15 лет назад. Одна из критических замечаний заключалась в том, что API был медленным (факт был, он был медленным, потому что люди действительно не понимали, как его использовать, но это еще одна история), поэтому API должен был быть разработан с учетом производительности.

Есть целый ряд факторов, связанный с ...

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

Это означает, что вы никогда не знаете, когда цикл краски может быть выполнен, поэтому нам нужно каким-то образом отреагировать на эти запросы.

Универсальность - еще один фактор. API достаточно абстрактен, что это не имеет значения (много), где компонент окрашивается. То есть вы можете быть окрашены на экран, принтер или даже изображение. Это означает, что вам не нужно повторять много кода краски, чтобы он работал на разных устройствах.

Вы также никогда не знаете, когда компонент станет отображаемым (т. Е. Когда он присоединен к собственному равноправному узлу). Это означает, что графический контекст может быть null, поэтому наличие «вспомогательных» методов может вызвать больше проблем. Когда вызывается paintComponent, вы (в основном) гарантируете наличие графического контекста для рисования.

Расширяемость будет еще одним фактором. Мало того, что очень легко переопределить paintComponent, чтобы изменить способ нанесения некоторых красок компонентов, также возможно, чтобы система рисования предоставила расширенный графический контекст, как и в текущем случае. Когда paintComponent вызывается (по крайней мере, подсистемой красок), он гарантирует, что контекст Graphics будет экземпляром Graphics2D, который является расширением до Graphics, что обеспечивает ряд важных улучшений API.

Все это делается без необходимости менять базовый класс, который используют люди, поэтому, если они не хотят использовать эти функции, они остаются незатронутыми ими.

Возможно, вы захотите ознакомиться с ...

Для получения более подробной информации

И помните "Картина весело";)

Дополнительные Мысли

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

Это означает, что если вам нужно печатать на принтере или отображать на изображение, вы можете использовать тот же API, что и для рисования на экране.

+0

А, я должен удалить свой ответ сейчас. Хороший ответ +1. –

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