Je travaille sur un JSlider personnalisé qui a un Rectangle de piste personnalisé. Je veux la possibilité de définir la couleur du rectangle de la piste lors de la première déclaration du curseur.Problème d'initialisation Jslider personnalisé
Voici un extrait de ce que j'ai (Les classes sont dans des fichiers séparés dans le même package):
public class NewSlider extends JSlider {
Color kolor;
public NewSlider (Color k) {
kolor = k;
}
public void updateUI() {
setUI(new NewSliderUI(this, kolor);
updateLabelUIs();
}
}
public class NewSliderUI extends BasicSliderUI {
Color sliderColor = Color.BLACK;
public NewSliderUI (JSlider b, Color k) {
super(b);
sliderColor = k;
}
}
Dans le code ci-dessus, « kolor » est initialement nul et conduit à et erreur lorsque tente NewSliderUI pour l'utiliser. Il semble que la méthode updateUI()
est appelée avant toute chose. Ensuite, le constructeur NewSlider est appelé. J'ai essayé une variété de choses, mais comme updateUI() semble fonctionner avant tout, rien de ce que j'ajoute à la classe NewSlider ne semble avoir d'importance.
Si je code en dur une couleur (c'est-à-dire setUI(new NewSliderUI(this, Color.BLACK);
), alors cela fonctionne, mais avoir une classe différente pour chaque couleur semble ridicule.
Merci.
Je suis assez sûr que ce n'est pas la possibilité 1 ou 2. Je n'ai aucune idée sur la possibilité 3. J'ai essayé le débogage. Le constructeur NewSlider appelle automatiquement le constructeur JSlider (ie super();) avant de faire quoi que ce soit d'autre. Il revient au constructeur NewSlider et affecte correctement "kolor". Cependant, jusqu'à ce que le point, kolor est nul. – SharpBarb
Hmm ... Ça peut marcher, je vais essayer quand j'ai une chance. J'ai regardé la source JSlider, et je pense que je comprends ce qui se passe. Le NewSlider appelle le constructeur JSlider avant toute chose, puis le constructeur JSlider appelle updateUI(). – SharpBarb
Oui, cela semble être ce qui se passe. Dites-moi comment ça finit! –