#java #java-2d
Вопрос:
Предполагая, что мы всегда используем JVM Sun (скажем, 1.5 ), всегда ли безопасно ссылаться на графику Graphics2D?
Я еще не видел, чтобы это вызывало какие-либо проблемы, и, насколько я понимаю, графический класс является устаревшим кодом, но разработчики Java не хотели изменять интерфейсы для классов Swing и AWT, чтобы сохранить обратную совместимость.
Ответ №1:
Согласно обсуждению здесь, всегда безопасно бросать от Graphics
до Graphics2D
. Однако я не могу быстро найти официальное заявление Sun по этому поводу.
Причина, по которой допустимо преобразование из графики в Graphics2D, заключается в том, что Sun сказала, что все графические объекты, возвращаемые API в Java 1.2 или выше, будут подклассом Graphics2D.
Еще один намек здесь с тем же выводом.
Графический объект всегда может быть отлит Graphics2D g2d = (Graphics2D)g;
Комментарии:
1. Спасибо за рекомендации. Я собираюсь принять это, даже если в нем прямо не упоминается источник Солнца, потому что я думаю, что он достаточно близок.
2. Насколько я помню, все документы Sun всегда показывают актерский состав для материалов Graphics2D, поэтому я предполагаю, что это безопасно. Если вы действительно хотите быть педантичным, вы могли бы использовать блок try/catch, но я думаю, что если у вас есть классы Graphics2D (достаточно новые JVM/библиотеки), вы в безопасности.
3. Первая связь мертва
Ответ №2:
В книге «Грязный богатый клиент» Чета Хааза и Ромена Гая говорится, что Свинг почти всегда использует Graphics2D
объект. Исключениями из этого являются печать и DebugGraphics
объект Swing. Так что до тех пор, пока ни одна из этих ситуаций не применима к вашему коду, его можно безопасно использовать Graphics2D
.
Оба автора работали в Sun, поэтому я бы предположил, что они знают, о чем говорят.
Ответ №3:
В следе 2D — графики говорится:
Чтобы использовать функции Java 2D API в приложении, приведите графический объект, переданный в метод визуализации компонента, к объекту Graphics2D. Например:
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
...
}
Это самый «официальный» источник, который я смог найти. Исходя прямо из учебных пособий Sun по Java, я бы сказал, что это официально санкционированный способ сделать это. Однако я бы не возражал, если бы в JavaDocs это было прописано…