2010-01-01 16 views
4

Comment puis-je indiquer à la méthode de peinture de dessiner un arrière-plan sur JPanel uniquement et non sur l'intégralité de JFrame. Ma taille de JFrame est plus grande que celle de JPanel. Lorsque j'essaie de peindre un fond de grille pour le JPanel, la grille semble être peinte sur tout le JFrame au lieu du JPanel.Peindre l'arrière-plan de JPanel

Voici les parties du code:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    } 


public void paint(Graphics g) 
{ 
    super.paintComponents(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    paintBackground(g2); //call a METHOD to paint the for JPANEL 
} 


private void paintBackground(Graphics2D g2) 
{ 
    g2.setPaint(Color.GRAY); 
    for (int i = 0; i < drawingPanel.getSize().width; i += 300) 
    { 
    Shape line = new Line2D.Float(i, 0, i, drawingPanel.getSize().height); 
    g2.draw(line); 
    } 

    for (int i = 0; i < drawingPanel.getSize().height; i += 300) 
    { 
    Shape line = new Line2D.Float(0, i, drawingPanel.getSize().width, i); 
    g2.draw(line); 
    }  
} //END private void paintBackground(Graphics2D g2) 

} 
+1

Je vous ai donné la bonne réponse mais vous ne l'acceptez pas. Bon à savoir pour le futur. – camickr

Répondre

3

cam est correct. Donc:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new MyPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    add(drawingPanel); 
    } 
} 

public class MyPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    myBackgroundRoutine(g2); 
    } 
} 

Vous devez strictement séparer votre dessin des différents composants. Swing est déjà sous-composants de gestion, donc il n'y a absolument aucun besoin d'implémenter des dessins dans votre panneau dans le cadre (l'appel de paintComponents() est une grave erreur). Et vous ne devez jamais surcharger paint(), car seul paintComponent() est utilisé dans Swing. Ne mélangez pas les deux jusqu'à ce que vous sachiez ce que vous faites.

+0

Merci Thorsten. – Jessy

0
super.paintComponents(g); 

je suggère que votre premier point d'enquête.

+0

merci, j'ai essayé, mais comme mon programme impliquait de dessiner en utilisant la souris glisser, j'ai besoin de super.paintComponents (s) pour supprimer la trace du dessin précédent lorsque je fais glisser mon dessin à un nouvel emplacement. – Jessy

5

Si vous voulez peindre sur le JPanel, remplacez le JPanel, pas le JFrame.

Vous devez remplacer la méthode paintComponent() de JPanel. Lisez la section du tutoriel Swing sur Custom Painting pour un exemple de travail.

+0

Merci pour le lien – Jessy

0

Le code que vous avez posté n'est pas complet, il manque comment le panneau est ajouté au JFrame et quel LayoutManager est utilisé.
Le code est correct. Êtes-vous sûr que le JPanel n'occupe pas toute la JFrame? Ajoutez un System.out.println(drawingPanel.getSize()) pour vérifier cela.
Si vous utilisez BorderLayout, la valeur par défaut de JFrame, et que vous venez d'ajouter le panneau sans aucune contrainte, le panneau utilise pour utiliser toute la zone. Le PreferredSize est ignoré.
Essayez cela, juste pour le test:

public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); // ignored 
    drawingPanel.setBounds(0, 0, 600, 600); // location and size 
    setLayout(null); 
    add(drawingPanel); 
} 

mais l'OMI ce n'est pas le meilleur ou correcte façon de le faire. Je préférerais remplacer la méthode paintComponent() du JPanel, comme suggéré par Thorsten et camickr.
Mais il utilisera toujours la totalité de la zone JFrame jusqu'à ce que d'autres composants soient ajoutés au JFrame ou au LayoutManager modifié.

0

Vous devez remplacer le JPanel, pas le JFrame à peindre. Vous pouvez remplacer la méthode paintComponent() du JPanel