2011-04-14 2 views
2

J'ai un JLayeredPane contenant trois JPanels, dont deux se chevauchent, auxquels je peins des formes. L'un des deux JPanels qui se chevauchent doit avoir toutes les formes dessinées pour l'effacer sans affecter les formes dessinées sur le JPanel sous lui disparaissent de l'écran. Actuellement, je suis en utilisant quelque chose comme ceci:Java Swing: Effacement de la peinture personnalisée à partir d'un JPanel superposé à d'autres JPanels dans un JLayeredPane

Graphics g = pane2.getGraphics(); 
    g.clearRect (0, 0, 1000, 1000); 

Mais ce non seulement peint à tout efface pane2 mais aussi pane1, qui est en dessous. Donc ma question est: Y at-il un moyen de effacer tout peint à un JPanel sans affecter quoi que ce soit peint à un JPanel en vertu de cela?

Répondre

2

Je pense que vous pouvez l'effacer de cette façon, puis la peindre de la manière standard. Quelque chose comme:

Graphics g = pane2.getGraphics(); 
g.clearRect (0, 0, 1000, 1000); 
super.paintComponent(g); 

Vous pourriez aussi avoir besoin de repeindre le JPanel fond. Si vous ne pouvez pas repeindre le fond JPanel - si, par exemple, vous n'avez pas une liste des formes n'importe où - alors je soupçonne qu'il ne peut pas être possible de récupérer sur le fond JPanel.

+0

Mais la compensation de cette façon efface non seulement tout ce JPanel, mais tout sur le JPanel en dessous. J'ai besoin de garder tout peint à la JPanel ci-dessous rester là. – JBenson

+0

Oh, je pense que vous pourriez avoir besoin de repeindre le JPanel ci-dessous alors. –

+0

Comment gérez-vous exactement les formes que vous peignez? Avez-vous une ArrayList ou quelque chose qui les retient, ou les peignez-vous simplement sur le JFrame et les perdez par la suite? –

2

Je pense que vous devriez utiliser le clip pour définir les régions qui ne doivent pas être remplacées. Dans le panneau 2, détecter quelle zone ne doit pas être endommagée et créer un ou plusieurs rectangle (s). Ensuite, créez une zone de clip. Rectangle avec zone soustraite. Voir Classe de surface pour soustraire la forme.

3

Assurez-vous que vos panneaux ne sont pas opaques. Je pense que vous avez besoin d'un code comme:

Graphics g = pane2.getGraphics();  
g.clearRect (0, 0, 1000, 1000); 
pane2.repaint(0, 0, 1000, 1000); 

Ou vous devriez être en mesure d'utiliser les éléments suivants pour forcer un repeindre de tous les panneaux:

layeredPane.repaint();