Необходимость восстановления исходного состояния графики при перезаписи краски или рисования компонента - PullRequest
9 голосов
/ 23 мая 2009

Я понимаю, что большая часть кода Java перезаписывается в paint или paintComponent, большинство из них не восстанавливает старое состояние графического объекта после того, как они изменили состояние графического объекта. Например, setStroke, setRenderingHint ...

Мне было интересно, является ли хорошей практикой восстановление прежнего состояния графического объекта перед возвратом из метода. Например

public void paintComponent(Graphics g) {
    super.paintComponet(g);
    Stroke oldStroke = g.getStroke();
    g.setStroke(newStroke);
    // Do drawing operation.
    g.setStroke(oldStroke);
}

Это хорошая практика? Или все кончено?

Ответы [ 2 ]

15 голосов
/ 23 мая 2009

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

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}
3 голосов
/ 23 мая 2009

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

Альтернатива состоит в том, чтобы ничего не предполагать в отношении графического контекста и устанавливать все необходимые свойства перед каждой картиной, если они настроены на что-то непонятное. Старайтесь избегать свободного создания и утилизации графических объектов для каждой операции.

Определенные свойства, которые вы всегда должны восстанавливать, если были изменены: (потому что они могут делать плохие вещи и иметь непредвиденные последствия):

  • Преобразование - потому что модификации этого будут накладываться друг на друга и их будет очень и очень трудно сбросить. Осторожно: это модифицируется методами преобразования, сдвига, масштабирования, поворота и преобразования в Graphics2D. Модифицирующие преобразования должны использоваться с ОСТОРОЖНОМ.
  • Stroke - потому что (по крайней мере, в моей конфигурации) оставление этого значения по умолчанию выполняется намного быстрее, чем любой параметр , даже если он эквивалентен значению по умолчанию. Не спрашивайте - это результат того, что графические конвейеры Java2D ускоряют процесс по умолчанию с использованием графического оборудования.
  • Клип: приведет к странным ошибкам, когда рисует только часть экрана.
  • Составной: большинство операций, вероятно, не ожидают, что это будет что-то странное.

Свойства, о которых не стоит беспокоиться:

  • RenderingHints. Это те вещи, которые вы можете легко установить и восстановить, и, как правило, вы хотите оставить их настроенными определенным образом (сглаживание и т. Д.) На все время работы приложения. Изменение RenderingHints редко нарушает рендеринг компонентов, хотя это может сделать его более уродливым.
  • Цвет фона и цвет краски. Большинство вещей изменят их перед тем, как рисовать.
  • Шрифт: аналогично.
...