Добавление смещения рендеринга в 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).