Попытка учесть панель задач в Java приводит к неточному размеру окна - PullRequest
2 голосов
/ 09 июля 2019

Когда я пытаюсь запустить этот код, он приводит к JFrame, который по некоторым причинам слегка смещен вправо примерно на 10 пикселей, а также высота окна выходит за пределы панели задач, когда желаемый эффект должен быть достигнутон заканчивает на панели задач.

Я попытался установить для jframe значение Undecorated, которое исправляет всю проблему, все заканчивается тем, что должно быть.Но в секунду, когда я установил undecorated на false, кажется, что это смещает и разрушает положение окна.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Component extends JComponent
{


/**
 * 
 */
private static final long serialVersionUID = 1L;

public int width, height;
public int tps;

private Game game;

public Component()
{
    Toolkit kit = this.getToolkit();
    width = (int) kit.getScreenSize().getWidth();
    height = (int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight();
    setLayout(new BorderLayout());
    setPreferredSize(new Dimension(width, height));

    game = new Game(this);
    add(game);

    initWindow("Test", this);
}

public void initWindow(String title, JComponent component)
{
    JFrame jf = new JFrame(title);
    jf.setResizable(false);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jf.add(component);
    jf.pack();
    jf.setLocationRelativeTo(null);

    jf.setVisible(true);
}

}

1 Ответ

0 голосов
/ 09 июля 2019

Проблема заключается в том, что вы вызываете 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...