2010-08-10 4 views
4

J'ai une classe qui étend JPanel avec plusieurs boutons. Je voudrais être en mesure de définir la police sur tous les boutons avec un appel à setFont (Police Font); Je définissaient la méthode setfont dans la classe JPanel en tant que tel:Passage de polices aux composants d'un JPanel

public class MyPanel extends JPanel { 
    private JButton[] buttons = new JButton[10]; 

    public MyPanel() { 
     for(int i = 0; i < 10; i++) { 
      buttons[i] = new JButton(""+i); 
      this.add(buttons[i]); 
     } 
    } 

    public void setFont(Font font) { 
     if(buttons != null) { 
      for(JButton b : buttons) { 
       b.setFont(font); 
      } 
     } 
    } 
} 

Cependant, la police sur le bouton ne change jamais. Je comprends que setFont est appelé par le constructeur JPanel, mais je ne comprends pas pourquoi, quand je l'appelle clairement APRES la création de l'objet MyPanel, les polices ne sont pas transmises aux boutons.

Merci à tous!

Brent

+0

Si vous avez besoin de plus d'aide poster votre SSCCE (http://sscce.org) – camickr

Répondre

3

Si vous voulez tous les boutons suivants dans l'application à utiliser une autre police, vous pouvez définir la valeur par défaut avant l'instanciation du panneau:

UIManager.put("Button.font", new FontUIResource("Dialog", Font.BOLD, 24)); 

Addendum: A approche plus ciblée pourrait être d'ajouter des instances d'un JButton étendu dans le constructeur de votre panneau:

buttons[i] = new MyButton(String.valueOf(i)); 
this.add(buttons[i]); 

Les nouveaux boutons auraient toujours la même police:

private static class MyButton extends JButton { 

    private static final Font font = new Font("Dialog", Font.BOLD, 24); 

    public MyButton(String text) { 
     super(text); 
     this.setFont(font); 
    } 
} 
+0

J'aime ça. Ce n'est pas exactement la solution que je cherche, mais c'est très utile. Merci beaucoup! –

1

Je crois que d'essayer la méthode « repeindre » sur chacun des boutons devrait fonctionner.

1

S'il s'agit d'un problème de repeindre, réduisez et rouvrez l'interface graphique pour voir si le repeint corrige le problème. Sinon, vous trouverez que quelque chose est en train de définir la police sur le bouton après que vous l'ayez fait. Proabaly la meilleure façon de diagnostiquer ceci est de créer une sous-classe de JButton (temporairement) et de l'utiliser pour déboguer les appels à setFont() - vous serez en mesure de vérifier la trace de la pile pour voir ce qui appelle.

Ainsi,

  1. commutateur à un seul bouton pour simplifier: private JButton[] buttons = new JButton[10];
  2. changement buttons[i] = new JButton(""+i);-buttons[i] = new MyJButton(""+i);
  3. créer MyJButton: MyJButton de classe étend DButton { @Override setFont public void (Font f) { super.setFont (f); // arrête cette ligne et voit qui appelle } }
  4. Une fois que vous avez trouvé s'il y a un setter plus tard, décidez comment corriger. Vous pouvez invoquerLater() ou mieux encore trouver un point logique (Post construction) pour modifier la police.

espoir qui aide

+0

J'ai ajouté ce commentaire à une autre réponse, mais je pensais que c'était approprié ici aussi. - Je construis le gui en premier, et la dernière chose que je fais est d'appeler setVisible (true). Je pense réellement que ce pourrait être l'appel de setVisible qui surcharge la police que je mets en place. Lorsque j'ajoute un "nouveau Throwable(). PrintStackTrace()" à la méthode setFont, je vois trois traces de pile. Un du constructeur JPanel, puis un depuis quand j'appelle explicitement setFont, et un troisième avec une pile qui est EXACTEMENT comme le premier appel du constructeur. Je pense, mais je ne suis pas sûr, que c'est à partir du dessin initial de la JPanel –

2

Je ne sais pas si vous le trouverez plus facile, mais vous pouvez également utiliser:

button.setFont(null); 

pour chacun des boutons. Puis, quand vous voulez changer la police que vous pouvez faire:

panel.setFont(...); 

et les boutons hériteront de la police du panneau. Je suppose que vous devez ensuite invoquer la méthode repaint() sur le panneau.

+0

Je ne le savais pas! Fait de bonne heure, le 'repaint()' dû à 'setVisible()' fonctionne. – trashgod

+0

Oui, si vous construisez l'interface graphique avant de faire le setVisible() vous ne devriez pas avoir à faire quelque chose de spécial. La suggestion repaint() était au cas où vous auriez besoin dynamiquement de changer la police. – camickr

+0

Je construis le gui en premier, et la dernière chose que je fais est d'appeler setVisible (true). Je pense réellement que ce pourrait être l'appel de setVisible qui surcharge la police que je mets en place. Lorsque j'ajoute un "nouveau Throwable(). PrintStackTrace()" à la méthode setFont, je vois trois traces de pile. Un du constructeur JPanel, puis un depuis quand j'appelle explicitement setFont, et un troisième avec une pile qui est EXACTEMENT comme le premier appel du constructeur. Je pense, mais je ne suis pas sûr, que c'est à partir du dessin initial du JPanel. –

Questions connexes