Java2D: всегда ли безопасно преобразовывать графику в Graphics2D

Предполагая, что мы всегда используем Sun JVM (скажем, 1.5+), всегда ли безопасно использовать ссылку Graphics на Graphics2D?

Я еще не видел, чтобы это вызывало какие-либо проблемы, и, насколько я понимаю, класс Graphics является устаревшим кодом, но разработчики Java не хотели менять интерфейсы для классов Swing и AWT, чтобы сохранить обратную совместимость.


person Outlaw Programmer    schedule 07.10.2008    source источник


Ответы (3)


Согласно обсуждению здесь, всегда безопасно использовать с Graphics по Graphics2D. Однако я не могу быстро найти официальное заявление Sun по этому поводу.

Причина, по которой допустимо приведение от Graphics к Graphics2D, заключается в том, что Sun заявила, что все объекты Graphics, возвращаемые API в Java 1.2 или выше, будут подклассом Graphics2D.

Еще одна подсказка здесь с тем же выводом.

Графический объект всегда можно преобразовать Graphics2D g2d = (Graphics2D)g;

person Jorge Ferreira    schedule 07.10.2008
comment
Спасибо за ссылки. Я собираюсь принять этот вариант, хотя он и не цитирует напрямую источник Sun, потому что я думаю, что он достаточно близок. - person Outlaw Programmer; 07.10.2008
comment
Насколько я помню, все документы Sun всегда показывают приведение к графическому 2D-материалу, поэтому я предполагаю, что это безопасно. Если вы действительно хотите быть педантичным, вы можете использовать блок try/catch, но я предполагаю, что если у вас есть классы Graphics2D (достаточно новые JVM/libs), вы в безопасности. - person MBCook; 08.10.2008
comment
Первая ссылка мертва - person FDinoff; 02.07.2015

В книге Чета Хааса и Ромена Гая Filthy Rich Client говорится, что Swing почти всегда использует объект Graphics2D. Исключениями являются печать и объект Swing DebugGraphics. Так что, пока ни одна из этих ситуаций не применима к вашему коду, безопасно приводить к Graphics2D.
Оба автора работали в Sun, поэтому я предполагаю, что они знают, о чем говорят.

person Roland Schneider    schedule 07.10.2008

В 2D Graphics Trail говорится:

Чтобы использовать функции Java 2D API в приложении, приведите объект Graphics, переданный в метод рендеринга компонента, к объекту Graphics2D. Например:

public void paint (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    ...
}

Это самый "официальный" источник, который я смог найти. Исходя прямо из учебных пособий Sun по Java, я бы сказал, что это официально санкционированный способ сделать это. Я бы не возражал, если бы JavaDocs прописал это, хотя...

person MathiasKegelmann    schedule 01.09.2009