Проблема заключается в том, что вы вызываете setPreferredSize
в конструкторе вашего Component
, поэтому запрос на определение размера применяется к содержимому фрейма.Когда JFrame
создает украшение, оно добавляет к этому измерению.Решение состоит в том, чтобы применить вызов к setPreferredSize
к JFrame
, например, в пределах initWindow
:
public void initWindow(String title, JComponent component)
{
JFrame jf = new JFrame(title);
Toolkit kit = this.getToolkit();
int width = (int) kit.getScreenSize().getWidth();
int height = (int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight();
jf.setPreferredSize(new Dimension(width, height));
// ...
}
Вот демонстрационная программа, которая, по крайней мере в моей системе, воспроизводит проблему идемонстрирует решение.Раскомментирование 1 и комментирование 2 воспроизводит проблему.Отмена закомментированной строки решает ее.
public class FitToScreenDemo {
public static void main(String[] args) {
JFrame frame = new JFrame();
JComponent component = new JComponent() {};
frame.add(component);
// component.setPreferredSize(getDimensionWithoutTaskBar()); // 1
frame.setPreferredSize(getDimensionWithoutTaskBar()); // 2
frame.pack();
frame.setVisible(true);
}
private static Dimension getDimensionWithoutTaskBar() {
return new Dimension((int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(),
(int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight());
}
}