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

Рейтинг: 2Ответов: 1Опубликовано: 25.02.2023

Есть код:

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);

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

Ответы

▲ 2

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

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

рамка

То есть:

JFrame = рабочая часть + рамка

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

Как решить проблему?

Есть два варианта:

Вариант 1: Установить напрямую размер рабочей поверхности окна (ContentPane). Этот вариант взят с enSO:

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

Этот вариант решает проблему, устанавливая размер именно рабочей части окна (ContentPane).

Вариант 2: установить панель (JPanel) как ContentPane. Это можно сделать вот так:

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

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

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);

Как работает вариант 2?

Раз в комментариях спрашивали, объясню подробней.

Когда вы вызываете метод setContentPane() и передаёте в параметры JPanel вы устанавливаете панель как рабочую часть окна, а не просто добавляете её на фрейм. Вы говорите: "панель - это рабочая часть окна, все остальные панели нужно добавлять на неё, ну и раз есть у окна обозначенная рабочая часть, то и при установки размеров фрейма размер устанавливать нужно этой рабочей части". Если бы вы просто добавили JPanel методом add(), то ничего бы не поменялось.

Ссылки

Пост на enSO.

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