2010-10-04 9 views
1

Le problème est, je suis incapable de faire une dimension avec 800x600. En d'autres termes, lorsque je lance le programme, le cadre est si petit que je ne peux rien faire avec.Comment puis-je agrandir mon cadre graphique?

Comment agrandir l'image?

J'ai défini la taille préférée et défini les limites du canevas.

Alors quel est le problème?

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(); 
    } 
} 

Répondre

5

Essayez d'encadrer le cadre après vous définissez la taille préférée du volet de contenu.

1

Vous appelez à pack() définira le cadre (et des composants en son sein) à leur taille préférée. Cependant, vous n'avez pas spécifié de taille préférée. Je suggère de supprimer vos deux appels à setBounds() et en appelant setBounds() dans la méthode principale au lieu de pack().

2

Non lié à votre question, mais basé sur le code que vous avez posté, il semble que vous ayez copié du vieux code AWT et que vous essayiez de l'utiliser dans une application Swing.

Je vous suggère de n'utiliser que des composants Swing. Il n'est pas nécessaire d'utiliser un Canvas avec une BufferStrategy. Il suffit d'utiliser un JPanel il est double buffered par défaut. L'extrait de code que vous avez copié est ancien et ce n'est pas le cas dans Swing.

N'utilisez pas de disposition nulle. Swing a été conçu pour être utilisé avec les gestionnaires de disposition. Ensuite, la méthode pack() sera capable de faire son travail correctement.

Il n'est pas nécessaire d'utiliser WindowListener pour fermer le cadre. Ces jours-ci les gens utilisent simplement:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

De plus, le cadre doit être rendu visible APRÈS avoir ajouté des composants au cadre.

En règle générale, vous devriez utiliser les raccourcis clavier, pas un KeyListener pour écouter les événements clés dans une application Swing.

Je vous suggère de regarder le Swing tutorial pour plus d'informations sur les concepts ci-dessus.