Composants premier plan et PaintComponent en arrière plan

Composants premier plan et PaintComponent en arrière plan - Java - Programmation

Marsh Posté le 20-09-2009 à 18:28:07    

J'ai une classe héritée de JPanel. J'y intègre 16*16 boutons(c'est un démineur) et j'aimerais les faire disparaître quand je clique dessus pour faire apparaitre le texte que j'ai mis en dessous avec un g.drawString(...),ou une image de mine g.drawImage(...): donc setVisible(false) .
 
Mais le paintComponent s'affiche en premier plan donc je vois déjà le texte ou l'image et faire disparaitre les boutons ne sert a rien.
J'ai mis des setOpaque() et des setVisible() de partout sa ne change rien.
 
Je sais que ce problème a déjà été posé de nombreuses fois mais je n'y ai jamais trouvé de réponse.Merci d'avance.

Reply

Marsh Posté le 20-09-2009 à 18:28:07   

Reply

Marsh Posté le 21-09-2009 à 15:32:05    

plutot que de mettre un bouton, tu ne pourrais pas simplement mettre une image de bouton?
 
De cette sorte, un clic sur le faux bouton se resumerait a un changement d'image.
 
Je sais bien que du point de vue IHM, c'est pas top, mais dans une vraie IHM, il est rare que les boutons disparaissent quand on clique dessus...

Reply

Marsh Posté le 23-09-2009 à 18:35:14    

Comment savoir à quel endroit on a cliqué si c'est pas un bouton ?

Reply

Marsh Posté le 23-09-2009 à 19:21:19    

éventuellement tu overrides les méthodes paint() et update() du bouton. Quand le bouton est là tu appelles l'implémentation normale via super() et quand le bouton doit disparaître du mets ton propre code qui dessine une image dans la zone.
 
C'est juste une idée, peut-être pas la meilleure qui soit :)

Reply

Marsh Posté le 24-09-2009 à 01:54:49    

J'ai écrit le code suivant pour vérifier ma théorie et cela semble bien fonctionner:
 

Code :
  1. import java.awt.Font;
  2. import java.awt.Graphics;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import javax.swing.UIManager;
  8.  
  9.  
  10. public class DemineurTest extends JFrame {
  11.  
  12.     private static final long serialVersionUID = 1L;
  13.  
  14.     private boolean clicked = false;
  15.  
  16.     public DemineurTest() {
  17.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  18.         setSize(200, 100);
  19.         final JButton bouton = new JButton("Hello World" ) {
  20.  
  21.             private static final long serialVersionUID = 1L;
  22.  
  23.             @Override
  24.             public void paint(Graphics g) {
  25.                 if (clicked) {
  26.                     g.clearRect(0, 0, getWidth(), getHeight());
  27.                     g.setFont(new Font("Arial", Font.BOLD, 20));
  28.                     g.drawString("BOOM", 5, 20);
  29.                 } else {
  30.                     super.paint(g);
  31.                 }
  32.             }
  33.             @Override
  34.             public void update(Graphics g) {
  35.                 if (clicked) {
  36.                     paint(g);
  37.                 } else {
  38.                     super.update(g);
  39.                 }
  40.             }
  41.         };
  42.         bouton.addActionListener(new ActionListener() {
  43.             @Override
  44.             public void actionPerformed(ActionEvent arg0) {
  45.                 clicked = true;
  46.                 bouton.repaint();
  47.             }
  48.         });
  49.         getContentPane().add(bouton);
  50.     }
  51.  
  52.  
  53.     public static void main(String[] args) {
  54.         try {
  55.             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  56.         } catch (Exception e) {}
  57.         new DemineurTest().setVisible(true);
  58.     }
  59.  
  60. }


Message édité par cbeyls le 24-09-2009 à 01:58:32
Reply

Marsh Posté le 26-09-2009 à 12:14:25    

J'ai trouvé pourquoi les boutons se mettaient en arrière plan:
J'ai crée une classe bouton héritée de JButton. Le fait d'utiliser la méthode paintComponent() ou paint() met les boutons en arrière plan.
Donc comment mettre une image sur les boutons sans ces méthodes ?
 
 

Reply

Marsh Posté le 26-09-2009 à 12:29:46    

C'est bon j'ai trouvé la solution à tout mes problèmes:
le bouton se met en premier plan quand il a une image donc de base je lui met une image blanche, quand on fait un clique droit image de drapeau et quand on fait clique gauche setVisible(false)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed