Добавление смещения рендеринга в Frame

Сценарий здесь такой: я использую объект Frame для рендеринга более низкого уровня с помощью AWT (без Swing). Единственная проблема заключается в том, что кадры при рендеринге непосредственно им не учитывают их границы. Итак, как мы все, наверное, знаем, рендеринг Rectangle в (0,0) не выглядит так, как будто он делает правильные вещи. Это потому, что (0,0) является литералом верхнего левого угла фрейма.

Таким образом, проблема заключается в том, что вместо добавления вставок Frame для всего, что будет отображаться на экране, вот так:

//This is within the rendering method in the Frame subclass. A buffer strategy is already created
Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, getWidth(), getHeight());
g.setColor(Color.WHITE);
Insets insets = this.getInsets();
g.drawString("FPS: " + getFPS(), 100 + insets.left, 100 + insets.top); //<-- Ugh.
g.dispose();

Я хотел бы иметь возможность просто добавить смещение сортов к базовой графике кадра. Это возможно? Чтобы было понятно, было бы неплохо иметь такую ​​функциональность, как эта:

g.setDrawingOrigin(x, y);

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

ПРИМЕЧАНИЕ. Это Frame, а не JFrame, поэтому у нас нет панели содержимого для ссылки. Другое дело, что было бы неплохо избегать добавления каких-либо других компонентов во фрейм. Я пытаюсь сделать это как можно более легким (следовательно, Frame вместо JFrame. Хорошо, нет большой разницы, но позвольте мне повеселиться:D).

2 ответа

Решение

Метод, который вы ищете - это графический перевод (int, int).

Так что вы бы позвонили,

g.translate(insets.left, insets.top);

Еще один подход заключается в том, что вместо рисования непосредственно во фрейм можно добавить еще один компонент, который помещается и использует все пространство фрейма, а затем выполнять все рисование в методе рисования этого подкомпонента, где x и y находятся там, где вы ожидаете.

Прямо из JavaDocs...

Размер рамки включает любую область, предназначенную для границы. Размеры области границы могут быть получены с использованием метода getInsets, однако, поскольку эти размеры зависят от платформы, действительное значение вставки не может быть получено до тех пор, пока кадр не будет отображен с помощью вызова pack или show. Поскольку область границы включена в общий размер кадра, граница эффективно скрывает часть кадра, ограничивая область, доступную для визуализации и / или отображения подкомпонентов, прямоугольником, который имеет местоположение в верхнем левом углу (вставки. слева, insets.top) и имеет размер ширины - (insets.left + insets.right) по высоте - (insets.top + insets.bottom).

Другие вопросы по тегам