Как лучше всего работать с графическими контекстами AWT? - PullRequest
4 голосов
/ 02 марта 2009

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

Приложение было разработано разработчиками всех уровней, от опытных ребят из Java до молодых парней прямо из университета, в течение пяти лет или около того, и, как и следовало ожидать, часть кода AWT - беспорядок , Теперь передо мной стоит задача исправить как можно больше зла в течение следующих нескольких месяцев или около того.

С этим легко разобраться. Работа с компонентами только в потоке диспетчеризации событий, асинхронный ввод-вывод, вроде бы, и я надеюсь, что сообщение будет передано остальной команде.

То, что я хотел бы знать, это лучший способ работы с контекстами Graphics, особенно в контексте paintComponent (). Я вижу много ...

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g;
    // ...Whole lotta drawing code...
}

Лучше ли это делать?

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g.create();
    // ...Whole lotta drawing code...
    gfx.dispose();
}

Если параметр g будет повторно использоваться в других красках, то мне не нужно восстанавливать его в хорошем состоянии, отменять AffineTransforms и т. Д .?

Ответы [ 2 ]

5 голосов
/ 02 марта 2009

Согласно Filthy Rich Clients, вы не должны изменять переданный вам объект Graphics (который сосет как API, IMO).

Правильный способ справиться с этим немного более многословен:

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}

IIRC, в реализации Sun не имеет значения, если вы не избавляетесь от объектов «sub-Graphics». (Не цитируйте меня об этом.)

Возможно, вы захотите делегировать этот бит комментария другому объекту.

0 голосов
/ 02 марта 2009

Я слышал, что это было исправлено в jdk-1.6.12, но не пробовал.

...