Почему мой JFrame случайно уменьшается при запуске на Mac? - PullRequest
1 голос
/ 04 апреля 2019

При работе на моем Mac-ноутбуке я недавно заметил, что мой кадр иногда сжимается при запуске программы. Это около 70-90% того, что оно сжимается.

Он работает, как и ожидалось, на ПК, но не на любом Mac, на котором я его пробовал. Я попытался немного сузить его (до кода ниже), но отсюда я не могу найти причину, по которой он не работает. Некоторые мои друзья считают, что это может быть связано с собственным оконным менеджером Mac. Я не знаю.

Я довольно новичок в этом, просто к вашему сведению.

public class Worms extends JFrame{

    public static void main(String[] args) {
        new Worms();
    }

    private JButton startGame;
    public Worms(){
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        Container contentPane = this.getContentPane();
        //if i change it so it uses a new dimension not "screenSize" it works
        contentPane.setPreferredSize(screenSize);


        JPanel menu = new JPanel();

        startGame = new JButton("Start Game"); 
        menu.add(startGame);//or if i remove this button it also works
        this.add(menu);


        this.pack();
        this.setVisible(true);
    }
}

Он начинается в полноэкранном режиме, затем сжимается в левый угол. Если я перетащу его обратно к нормальному размеру, он будет работать как обычно.

1 Ответ

3 голосов
/ 04 апреля 2019
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

Container contentPane = this.getContentPane();
//if i change it so it uses a new dimension not "screenSize" it works
contentPane.setPreferredSize(screenSize);

На панели содержимого , а не должен быть установлен предпочтительный размер экрана.Это слишком велико и не учитывает декорации рамок или «хром».

Вот другой подход, который должен надежно работать во всех системах.Он устанавливает расширенное состояние кадра.

import java.awt.*;
import javax.swing.*;

public class Worms extends JFrame{

    public static void main(String[] args) {
        new Worms();
    }

    private JButton startGame;
    public Worms(){
        JPanel menu = new JPanel();

        startGame = new JButton("Start Game"); 
        menu.add(startGame);
        this.add(menu);

        this.pack();
        // this should do what you seen to want
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        // this is just polite..
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }
}

Обратите внимание, что графические интерфейсы Swing / AWT должны создаваться и обновляться в потоке диспетчеризации событий.Приведенный выше пример не добавляет этого ради простоты.

...