2010-10-04 4 views
1

Проблема в том, что я не могу сделать измерение размером 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(); 
    } 
} 

ответ

5

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

1

Вы звоните pack() установит кадр (и компоненты внутри него) для их предпочтительного размера. Однако вы не указали предпочтительный размер. Я предлагаю удалить два звонка на setBounds() и позвонить setBounds() в основном методе вместо pack().

2

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

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

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

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

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

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

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

Смежные вопросы