Как масштабировать JFrame вокруг JPanel?

Я пытаюсь запрограммировать игру PONG.

Моя проблема: я использую JPanel как «поле соответствия» с размером (1000; 600). Но когда я добавляю JPanel в JFrame с помощью setSize (размер поля совпадения), у меня возникает проблема с правой и нижней границей. Кажется, что JFrame получает размер (1000; 600), а JPanel становится меньше. Как я могу это исправить?


person Bumblebee    schedule 26.06.2017    source источник
comment
Используйте JFrame#pack, это упакует окно вокруг содержимого, это предполагает, что ваши компоненты предоставляют соответствующие подсказки по размеру   -  person MadProgrammer    schedule 27.06.2017


Ответы (1)


Размер JPanel должен определяться его предпочтительным размером, а не размером. Самый простой способ сделать это — вызвать для него setPreferredSize(...), но это позволяет другому коду изменять предпочтительный размер, поэтому самый безопасный способ — переопределить его метод public Dimension getPreferredSize(). Затем JFrame будет иметь правильный размер, если JPanel будет добавлен к BorderLayout JFrame с использованием contentPane, а затем вы вызовете pack() в JFrame после добавления JPanel и перед его отображением.

Например:

public class MyJPanel extends JPanel {

    private static final int PREF_W = 1000;
    private static final int PREF_H = 600;

    public MyJPanel() {
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // to make smooth graphics
        Graphics2D g2 = (Graphics2D) g; 
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // do your drawing here
    }

    // size the JPanel correctly
    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("My GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new MyJPanel());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
person Hovercraft Full Of Eels    schedule 26.06.2017