2010-03-09 3 views
3

J'ai une situation dans laquelle j'ai un tas de JButtons sur un GridLayout. J'ai besoin chacun des JButton Souhaitée:Dessiner des graphiques au-dessus d'un JButton

  1. une image d'arrière-plan (tout en conservant la capacité de garder le bouton par défaut regard si nécessaire)
  2. graphiques personnalisés dessiné sur le dessus par d'autres classes

I Je n'ai aucun problème avec l'image d'arrière-plan, puisque j'utilise setIcon() mais j'ai des problèmes pour dessiner des choses en arrière-plan. À un moment donné, j'ai pu dessiner sur le dessus du bouton, mais après que le bouton a été cliqué, les dessins ont disparu. Comment peut rendre le bouton garder cet état de dessin?

Fondamentalement, je besoin d'un moyen pour mes JButton d'avoir des méthodes publiques qui permettraient une autre classe de tirer quoi que ce soit à ce sujet, comme:

public void drawSomething() { 
    Graphics g = this.getGraphics(); 
    g.drawOval(3,2,2,2); 
    repaint(); 
} 

ou

public Graphics getGraphics() { 
    return this.getGraphics(); 
} 

alors une autre classe pourrait faire ceci:

button.getGraphics().drawSomething(); 

ce dernier est plus ce que je cherche, mais la première est tout aussi utile.

Y a-t-il un moyen de s'y prendre? En outre, remplacer la méthode de classe parente paintComponent() n'aide pas puisque j'ai besoin que chaque bouton ait des graphismes différents.

Répondre

8

vous pouvez sous-classer JButton et remplacer paintComponent(). vous pouvez gérer chaque bouton ayant un graphisme différent en fournissant un «peintre» externe à la sous-classe. Ou juste avoir une sous-classe différente pour chaque graphique différent.

public class MyButton extends JButton { 
    private Painter painter; 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     painter.paint(g); 
    } 
} 

public interface Painter { 
    public void paint(Graphics g); 
} 

vous ne pouvez pas peindre sur le bouton que vous faites que la peinture va se perdre lorsque le bouton est ensuite repeint.

+1

J'avais effectivement utilisé cette approche plus tôt, sauf que je n'avais pas utilisé d'interface. Je l'ai abandonné parce que je pensais qu'il pourrait y avoir un moyen plus facile. C'est une approche plus élégante, merci. – trinth

+0

heureux que cela vous a aidé – objects

3

Vous pouvez créer une image tamponnée et y appliquer une peinture personnalisée, puis dessiner l'image dans votre méthode paintComponent (...) personnalisée. Voir l'exemple DrawOnImage de Custom Painting Approaches.

+1

Merci pour la réponse, j'ai considéré cela, mais j'ai décidé d'aller avec la réponse de l'interface. – trinth

Questions connexes