2009-10-09 8 views
2

J'ai un problème d'affichage du dessin sur JPanel. J'ai créé trois classes qui sont liées les unes aux autres comme suit. Je me demandais pourquoi ce code, n'affiche pas mon dessin.JPanel n'affiche pas le dessin

c.add(pDraw); 
pDraw.add(draw); 

1) MAIN

public class mainPage { 
    public static void main(String[]args){ 
     JFrame appFrame = new Frame(); 
     appFrame.setVisible(true); 
     appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

2) Jframe

public class Frame extends JFrame implements ActionListener{ 

    private drawingBoard draw; 

    public Frame(){ 
     draw = new drawingBoard(); //generate pattern 
     GridBagLayout m = new GridBagLayout(); 
     Container c = (Container)getContentPane(); 
     c.setLayout (m); 
     GridBagConstraints con; 
     ....... 

     JPanel pDraw = new JPanel();  
     pDraw.setPreferredSize(new Dimension(500,500)); 
      ..... 
     c.add(pDraw); 
     pDraw.add(draw); // Call other class for drawing 

     ..... 
     setResizable(false); 
     pack(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 
} 

3) DPanel

public class drawingBoard extends JPanel { 
     ..... 
     public void paint(Graphics g) { 
     ...... 
     } 
    } 
+2

Sans les contraintes de mise en page ou 'peinture (Graphics)' Code ceci est un peu difficile à déboguer. En haut de ma tête, 'drawingBoard' est de taille 0x0 en raison d'une erreur de mise en page; ou votre code de peinture est bancal. Sinon, avez-vous débogué votre code pour confirmer que 'paint (Graphics)' est appelé? –

+0

Merci Kevin, tu as absolument raison, j'ai oublié de régler la taille du dessin :-). La méthode paint() fonctionne bien. Merci encore. – Jessy

+0

Devrait avoir posté comme une réponse je suppose. : / –

Répondre

0

Bien qu'il soit un peu difficile à déboguer le code sans voir les GridBagConstraints ou la méthode paint(), je vous offrira qu'il est généralement préférable de remplacer la méthode paintComponent() plutôt que la méthode paint(). Dans drawingBoard, essayez ceci au lieu de surcharger paint():

public void paintComponent(Graphics g) { 
    super.paintComponent(g); //optional 
    ... 
} 

Cela peut faire une différence. Pour plus d'informations, check out this article from Java.

De même, en tant que freebie, vous n'avez probablement pas besoin d'exécuter setVisible() et setDefaultCloseOperation() dans la méthode main() et dans le constructeur de Frame.

1

Il s'agit d'une modification d'une ligne à votre code.

Tout ce que vous avez à faire est de lire le Swing tutorial on "Custom Painting" pour savoir ce que vous faites mal.

Ceci est la troisième question d'affilée qui aurait pu être résolue en quelques minutes si vous avez pris la peine de lire le tutoriel.

Et vous n'avez toujours pas appris comment publier un SSCCE, donc je ne vais pas vous donner la réponse.

0

Je suis d'accord avec tous les points que Ben Torell a fait dans son article - plus quelques conseils de dépannage supplémentaires ici.

Essayez ceci -

public class DrawingBoardTest extends JFrame { 
    public DrawingBoardTest() { 
     getContentPane().add(new drawingBoard(), BorderLayout.CENTER); 
    } 
    public static void main(String[] args) { 
     JFrame f = new DrawingBoardTest(); 
     f.setSize(500, 500); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 
} 

Si le drawingPanel apparaît, il est un problème avec votre GridBagLayout, ou ayant une taille préférée définie sur drawingPanel qui n'est pas assez grand pour afficher le dessin, ou en ajoutant DrawingBoard à pDraw (qui, d'après ce que je peux voir du code, n'est pas vraiment nécessaire ...). La mise en page par défaut pour le volet de contenu d'un JFrame est BorderLayout, qui donnera tout l'espace au composant central, où je place dessinBoard dans le code que j'ai posté.

La disposition par défaut d'un JPanel est FlowLayout, qui donnera seulement la taille préférée du composant. Je vois que vous définissez la taille préférée sur pDraw, mais pas sur drawingBoard, dans le code original - drawingBoard peut avoir un ensemble de taille préféré qui est trop petit pour afficher le dessin.

Si le drawingPanel n'apparaît pas, cela pose un problème dans votre méthode drawingPanel paint().

3

Voici la réponse, j'ai oublié de définir la taille de la planche à dessin JPanel :-)

public class drawingBoard extends JPanel { 
     public drawingBoard(){ 
     setPreferredSize(new Dimension (500,500)); 

     } 
    }