Как сделать, чтобы рабочая часть JFrame была равна устанавливаемым размерам окна?

Есть код:

JFrame frame = new JFrame();
frame.setSize(200,200);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

При его запуске создаётся окно с размером 186х193. Но мне нужна рабочая часть окна 200х200 (без учёта рамки и заголовка).

Мне приходиться делать вычисления, чтобы рабочая часть окна имела размер 200х200:

frame.setSize(216,239);

можно как-то автоматизировать этот процесс?


Ответы (1 шт):

Автор решения: Зонтик

Из-за чего происходит проблема?

JFrame - это окно вашего приложения. Но у каждого окна есть рамка:

рамка

И рамка учитывается в размерах окна, когда вы просто вызываете метод setSize().

Как её решить?

Вам нужно установить размер рабочей поверхности окна (ContentPane). Самый простой вариант - с английского аналога :

jFrame.getContentPane().setSize(800,400);

Он решает проблему, но лучше установить на фрейм JPanel как ContentPane. Это можно сделать вот так (уже мой собственный вариант, из головы):

JPanel panel = new JPanel();
frame.setContentPane(panel);

На английском сайте тоже самое предлагают сделать немного по-другому:

JFrame jf = new JFrame();
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(400,800));
jf.getContentPane().add(jp);
jf.pack();

Важно: добавить на фрейм панель нужно до того, как вы отображаете окно:

JFrame frame = new JFrame();
JPanel panel = new JPanel();
frame.setContentPane(panel);
frame.setSize(200,200);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Ссылки

Пост на английском аналоге.

И здесь немного про ContentPane.

→ Ссылка