2010-05-18 5 views
8

Мне нужно найти точный размер экрана компонента в пикселях при изменении размера основного JFrame.Java (Swing): поиск размера * экрана * экрана при изменении размера окна

Я пробовал несколько вещей и не мог найти простой способ сделать это: возможно, он пропустил что-то очевидное.

BBBBB JFRAME BORDER BBB 
BZZZZZZZZZZZZZZZZZZZZZB 
BAAAAAAAAAAAAAAAAAAAAAB 
BCC1................DDB 
BCCC................DDB 
BCCC................DDB 
BCCC................DDB 
BCCC................2DB 
BEEEEEEEEEEEEEEEEEEEEEB 
BBBBBBBBBBBBBBBBBBBBBBB 

измененными размерами, он мог бы стать это, если, скажем, пользователь сделал основной JFrame короче (по вертикали) и шире (по горизонтали):

BBBBBB JFRAME BORDER BBBBBB 
BZZZZZZZZZZZZZZZZZZZZZZZZZB 
BAAAAAAAAAAAAAAAAAAAAAAAAAB 
BCC1....................DDB 
BCCC....................2DB 
BEEEEEEEEEEEEEEEEEEEEEEEEEB 
BBBBBBBBBBBBBBBBBBBBBBBBBBB 

То, что я хочу, чтобы найти точный размер в пикселей, на экране, области прямоугольника, обозначенной точками.

Я добавляю ComponentListener, чтобы получить события изменения размера, которые отлично работают.

Проблема у меня в том, что вызов GetWidth()/GetHeight() на компонент делает, по-видимому не возврата размер экрана компонента, но фактический размер компонента (и вы можете иметь, например, JPanel шире чем компонент, в который он входит).

Подсказка приветствуется.

+2

+1 для рисунков ASCII. – Finglas

+0

@Finglas: спасибо, понял, что он был более «эластичным», чем какая-то ссылка на изображение Photobucket или такая :) – SyntaxT3rr0r

ответ

9

Вы ищете JComponent.getVisibleRect().

+0

спасибо большое, я * знал * Мне не хватало чего-то очевидного. Решает мою проблему красиво и отлично работает с менеджером макета, который я использую и т. Д. :) – SyntaxT3rr0r

1

getWidth() и getHeight() возвращает ширину и высоту компонента. Я никогда не слышал никакой разницы между «фактической» шириной/высотой и шириной/высотой экрана.

Некоторые менеджеры компоновки, однако, не заполняют панель компонентом, который он содержит, и некоторое пространство между компонентом и краем панелей может не занимать компонент. В этом случае я обычно setBackground(Color.BLUE) на панели ниже, чтобы посмотреть, что происходит.

+0

@aioobe: вы никогда не видели, чтобы контент JPanel обрезался, потому что JFrame меньше, чем JPanel!? – SyntaxT3rr0r

+2

Если это поведение вы видите, то кажется, что ваш менеджер макетов разбит. Какой менеджер компоновки вы используете? – aioobe

+0

@aioobe: GridLayoutManager IntelliJ IDEA, который, вероятно, используется для самой IntelliJ IDEA. Я как-то сомневаюсь, что он сломан, но я попробую с BorderLayout посмотреть. – SyntaxT3rr0r

0

Это очень мусорный способ, но вы можете использовать панель обертки, куда вы вставляете свою основную панель. Чем вы можете позвонить getWidth() и getHeight() с панели обертки.

+0

Он тоже, я тоже это пробовал, но в моем случае это не сработало: у меня все равно будет компонент (ы), дающий мне getWidth()/getHeight(), который будет * not * быть реальным w/h. Однако ответ Нейта прямо на месте: * getVisibleRect() * делает ** действительно ** возвращает реальный видимый прямоугольник :) – SyntaxT3rr0r

Смежные вопросы