2013-08-04 3 views
3

Pourquoi JFrame est vide après mes graphiquesPourquoi JFrame est vide après mes graphiques

package javaGame; 

import java.awt.Graphics; 

import javax.swing.JFrame; 


public class javaGame extends JFrame { 

    public javaGame(){ 
     setVisible(true); 
     setSize(250,250); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Java Game"); 
    } 

    public void paint (Graphics g){ 
     g.drawString("Hello world!", 75, 75); 
    } 

    public static void main (String[] args){ 
     new javaGame(); 
    } 
} 
+0

Je ne peux pas voir où vous peignez vraiment. –

+3

Vous devriez mieux lire un tutoriel sur Swing. – Mordechai

+1

Apprenez s'il vous plaît les conventions de nommage Java et respectez-les – kleopatra

Répondre

3

Vous êtes habitué applets, où remplaçant paint va effectivement travailler. Dans un JFrame, la technique recommandée est un peu plus compliquée. Ajoutez ce code à votre constructeur:

getContentPane().add(new JPanel() { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawString("Hello world!", 75, 75); 
    } 
}); 

Cela crée une sous-classe anonyme de JPanel qui l'emporte sur paintComponent pour faire un peu de peinture, ajoute le JPanel au cadre. L'appel au super.paintComponent est important.

Il y a plusieurs autres choses que vous devez savoir sont différents des applets:

  • Vous devez appeler setVisible(true) pour faire apparaître le cadre. Ceci est obligatoire pour que votre programme fonctionne. Vous devez ajouter setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) si vous souhaitez que le programme soit fermé si la fenêtre est fermée. Hautement recommandé.
1

Lorsque vous l'ouverture d'un nouveau cadre, vous devez le rendre visible après validate ou pack est appliquée, appelez également setVisible(true) à la fin de la création du cadre. Le code de modification:

public void paint (Graphics g){ 
    super.paint(g); 
    g.drawString("Hello world!", 75, 75); 
} 
+0

Bien que techniquement créé, il n'est pas recommandé de remplacer 'paint', en particulier des conteneurs de niveau supérieur. Au lieu de cela, il est recommandé de remplacer le composant paintComponent des composants s'étendant de '' JComponent'' à la place – MadProgrammer

+0

Oh, mais cela fonctionne aussi, car cet exemple est applicable. Je ne pense pas que OP essaie de dessiner des composants. –

+0

Peu importe, il est recommandé d'effectuer toute la peinture personnalisée à partir de la méthode 'paintComponent' des classes s'étendant de' JComponent' (comme 'JPanel'). Pour commencer, vous pouvez facilement visser la chaîne de peinture et les conteneurs de niveau supérieur ne sont pas à double tampon;) – MadProgrammer

1

1) Suivre les conventions de code java javaGame doit être JavaGame

2) programmes Swing devrait l'emporter sur paintComponent() au lieu de passer outre paint().

3) Vous devriez faire une peinture personnalisée dans un composant JComponent comme JPanel.

Changez votre code pour par exemple quelque chose comme ceci.

public class JavaGame { 

    private JFrame frame; //use composition instead of concrete inheritance 

    public JavaGame() { 
     jframe.setSize(250,250); 
     jframe.setResizable(false); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setTitle("Java Game"); 
     jframe.add(new JPanel() { 
      @Override 
      public void paintComponent (Graphics g) { 
       super.paintComponent(g); 
       g.drawString("Hello world!", 75, 75); 
      } 
     }); 
     jframe.pack(); //sizes the frame 
     jframe.setVisible(true); 
    } 

    public static void main (String[] args) { 
     SwingUTilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new javaGame(); 
      } 
     }); 
    } 
} 
+1

Pardonnez-moi pour l'édition, même si c'était nécessaire je suppose, vous avez oublié d'ajouter la méthode 'run()' pour l'interface 'Runnable' :-) –

+0

J'ai oublié thx pour l'édition :-) – nachokk