Рисование Rectanlge идеально центрировано на Java - PullRequest
1 голос
/ 09 января 2011

Я хочу рисовать объекты (включая размещение компонентов) в контейнере, нарисованном идеально в середине.

Проблема в том, чтобы использовать средние x и y и вычесть / добавить половину ширины окна иВысота не достаточно.

Когда я рисую прямоугольник, используя этот код:

g.drawRect( 10, 10, this.getWidth() - 20, this.getHeight() - 20);

Тогда это не сработает.С помощью линии выше я хочу нарисовать прямоугольник с отступом 10 пикселей со всех сторон.Поэтому я начинаю с 10x10, затем беру полную ширину и полную высоту окна и вычитаю 20 из него, потому что 10 с левой стороны и 10 с правой стороны.

В этом случае я должен получитьпрямоугольник с идеально отцентрированным расстоянием в 10 пикселей до границы окна.

Но правая и нижняя части прямоугольника находятся вне окна, поэтому ширина и высота, заданные методу drawRect, слишком велики.

Я думаю, что это происходит от границы окон.Точка 0x0 - это не точка, в которой вы ВИДИТЕ чертежи.Я предполагаю, что 0x0 начинается в самой верхней левой точке самого окна (без области рисования).

Так что в этом случае мне нужно знать область рисования.Что-то вроде прямоугольника, дающего мне координаты, где мне нужно начать рисование, чтобы я мог сопоставить свои координаты с координатами окон.

Поэтому, когда я хочу нарисовать точку в 0x0 (видимой области рисования), тогдаэта точка должна быть сопоставлена ​​с чем-то вроде 8x30.

Я сделал тест, добавив слушателя мыши, печатающего положение мыши, когда мышь перемещается.Когда я перемещаю мышь в крайнее левое положение области рисования, мое приложение печатает координаты 8x30.это означает, что левая граница имеет ширину 8 пикселей, а верхняя панель (показывающая заголовок окна и кнопки закрытия / минимизации) имеет высоту 30 пикселей.

Как мне теперь это сделать.Я хотел бы сказать что-то вроде

g.drawRect( 10, 10, this.getWidth() - 20, this.getHeight() - 20);

, чтобы я рисовал прямоугольник идеально по центру даже при изменении размера окна.

Я думаю, что легче понять мою проблему, когда вы пытаетесь рисоватьthis:

Font font = g.getFont(); 
FontRenderContext frc = g.getFontMetrics().getFontRenderContext(); 
Rectangle2D rect = font.getStringBounds( "Hello", frc); 
g.drawString( "Hello", (int) ( this.getWidth() - rect.getWidth()), (int) ( this.getHeight() - rect.getHeight())); 

Это берет размер текста "Hello", затем пытается напечатать его в правом нижнем углу.Код верный, но текст «Hello» появляется в правом нижнем углу, мне нужно изменить размер окна (сделать его больше), чтобы увидеть текст.

Ответы [ 2 ]

1 голос
/ 09 января 2011

Метод getInsets() вашего контейнера должен обеспечивать смещения координат, которые необходимо применять при рисовании.

Вот ссылка на пример примера кода .

1 голос
/ 09 января 2011

Вы рисуете прямо на JFrame? Было бы проще, если бы вы создали JPanel для рисования и добавили JPanel в JFrame. Начало координат в верхней левой части панели не будет беспокоить граница рамки или строка заголовка.

...