2016-08-28 3 views
0

Je suis en train de tenter de créer un jeu très simple, mais j'ai rapidement rencontré un problème. La boîte qu'il est censé dessiner ne s'affiche que partiellement. Il semble que cela ne peut être affiché que dans une zone limitée, mais je n'ai aucune idée de ce qui aurait causé cela ou comment je peux le résoudre.JComponent affiche seulement partiellement

public class Game 
{ 
    public static void main(String[] args) 
    { 
     Game game = new Game(); 
    } 

    public Game() 
    { 
    JFrame gameFrame = new JFrame(); 
    JPanel somePanel = new JPanel(); 
    Box testBox = new Box(10, 10, 20, 20); 
    somePanel.add(testBox); 
    gameFrame.add(somePanel); 
    gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gameFrame.add(testBox); 
    gameFrame.setResizable(true); 
    gameFrame.setBounds(500, 500, 600, 350); 
    gameFrame.setVisible(true); 
    } 
} 

la classe principale

public class Box extends JComponent 
{ 
    private int x; 
    private int y; 
    private int width; 
    private int height; 

    public Box(int x, int y, int width, int heigth) 
    { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = heigth; 
    } 

    public void paintComponent(Graphics g) 
    { 
     g.drawRect(x, y, width, height); 
    } 
} 

et la classe qui est ('nt) le dessin du rectangle.
Note: C'est la première fois que j'utilise Stackoverflow, donc si j'ai fait quelque chose de mal, dites-le moi s'il vous plaît.

Voici une image du cadre:

http://i.imgur.com/PT9Yg14.png

Dessin de la boîte avec une classe JPanel extension semble fonctionner, ce n'est pas ce que je voulais, mais au moins cela fonctionne.

+0

Veuillez formater correctement votre code et mettre en place un programme minimal complet reproduisant le problème. Ce code ne compile pas, et si je renomme g2d en g, alors cela fonctionne bien (bien que somePanel soit inutile, puisque vous y ajoutez la case, mais immédiatement après l'ajouter au frame lui-même). Respectez également les conventions de dénomination Java. Les variables commencent par une lettre minuscule. –

+0

Vous ajoutez deux fois la boîte de test - une fois sur un panel, une fois sur gameframe. – Kylar

+0

@Kylar Juste essayé de supprimer cette ligne, mais il semble que rien n'a changé. – aulerelyn

Répondre

0

Ceci est ma première fois en utilisant Stackoverflow ...

Captures d'écran doivent être inclus dans la question afin que nous puissions voir l'image sans cliquer dessus. En tant que nouvel utilisateur, je ne pense pas que vous incluez l'image, mais vous pouvez inclure le lien dans votre question. Quelqu'un général ajoutera l'image à la question pour vous.

Le code fonctionne bien pour moi lorsque le composant Box est ajouté directement au cadre.

L'image que vous fournissez n'a aucun sens. La taille de vos lignes peintes est beaucoup plus grande que 20 pixels, donc l'image semble correspondre à votre code affiché. Assurez-vous que l'image est générée lors de l'exécution du code affiché.

Normalement, lorsque vous effectuez une peinture personnalisée, vous devez remplacer la méthode paintComponent(...) de JPanel et appeler super.paintComponent(...) comme première instruction. Lisez la section du tutoriel Swing sur Custom Painting pour plus d'informations et d'exemples. Notez en particulier comment vous devez remplacer la méthode getPreferredSize(). Si vous ne le faites pas, les gestionnaires de disposition penseront que la taille est (0, 0), donc il n'y aura rien à peindre.

Si vous ne développez pas un JPanel, vous êtes responsable de peindre l'arrière-plan de votre composant JComponent car aucune peinture par défaut n'est effectuée. Le code de base peut être quelque chose comme:

g.setColor(getBackground()); 
g.fillRect(0, 0, getWidth(), getHeight()); 
g.setColor(getForeground()); 
g.drawRect(...); 

De même, n'appelez pas votre boîte de classe. Il y a déjà un composant Swing de ce nom, donc cela risque de prêter à confusion. Le nom de la classe devrait être plus descriptif.