Как я могу увеличить размер моего GUI Frame? - PullRequest
1 голос
/ 04 октября 2010

Проблема в том, что я не могу сделать его размером 800x600.Другими словами, когда я запускаю программу, рамка настолько мала, что я ничего не могу с ней сделать.

Как увеличить рамку?

Я установил предпочтительный размеруже задаем границы холста.

Тогда в чем проблема?

public class GameCanvas extends Canvas
{
    private BufferStrategy buffer = null;

    public GameCanvas() 
    {
        setBounds(0, 0, 800, 600);
        setIgnoreRepaint(true);

        addKeyListener(new KeyInputHandler());

        requestFocus();     
    }

    public void addNotify()
    { 
        super.addNotify();
        this.createBufferStrategy(2);
        buffer = this.getBufferStrategy();

        setBounds(0, 0, 800, 600);
    }
}

public class GameGuiFrame extends JFrame
{
    private JPanel panel = new JPanel();
    private GameCanvas canvas = new GameCanvas();

    public GameGuiFrame()
    {
        this.setName("My Game");

        this.pack();
        this.setResizable(false);
        this.setVisible(true);

        panel = (JPanel) this.getContentPane();
        panel.setPreferredSize(new Dimension(750,500));
        panel.setLayout(null);
        panel.add(canvas);
    }
}

public class GameManager
{
    public static void runGameLoop()
    {
        GameGuiFrame container = new GameGuiFrame();

        container.addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) 
            {
                System.exit(0);
            }
        });
    }
}

public class Main
{
    public static void main(String [] args)
    {
        GameManager.runGameLoop();
    }
}

Ответы [ 3 ]

5 голосов
/ 04 октября 2010

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

2 голосов
/ 04 октября 2010

Не относится к вашему вопросу, но на основании кода, который вы разместили, похоже, что вы скопировали старый код AWT и пытаетесь использовать его в приложении Swing.

Я бы предложил вам использовать только Swingкомпоненты.Нет необходимости использовать Canvas с BufferStrategy.Просто используйте JPanel, по умолчанию это двойная буферизация.Скопированный фрагмент кода устарел, и это не так, как в Swing.

Не используйте пустой макет.Swing был разработан для использования с менеджерами верстки.Тогда метод pack () сможет правильно выполнять свою работу.

Нет необходимости использовать WindowListener для закрытия фрейма.В эти дни люди просто используют:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Кроме того, рамку следует сделать видимой ПОСЛЕ добавления компонентов к рамке.

Обычно вам следует использовать привязки клавиш, а не KeyListener дляпрослушайте ключевые события в приложении Swing.

Я предлагаю вам взглянуть на учебник Swing для получения дополнительной информации о вышеупомянутых концепциях.

1 голос
/ 04 октября 2010

При вызове pack() будет установлен фрейм (и компоненты внутри него) на их предпочтительный размер. Однако вы не указали предпочтительный размер. Я бы предложил удалить два ваших вызова к setBounds() и вызвать setBounds() в основном методе вместо pack().

...