2010-01-26 6 views
1

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.

Répondre

1

Je ne vois pas comment kolor pourrait être nul à moins que l'un des éléments suivants se produisent:

  1. vous passez une valeur nulle au constructeur
  2. Vous n'êtes pas instanciation NewSlider dans Swing EDT et rencontre des problèmes de cache étranges
  3. NewSlider est en cours de construction par réflexion/désérialisation et kolor n'est pas défini.

Avez-vous essayé d'exécuter ceci dans le débogueur avec quelques points d'arrêt? Je serais curieux de m'assurer que le constructeur NewSlider est appelé (et avant le constructeur NewSliderUI).

Editer: Je vois ce que vous voulez dire ci-dessous. J'ai oublié que le constructeur no args pour JSlider s'appelait implicitement. Qu'en est-il de faire ce qui suit:

public class NewSlider extends JSlider { 

    Color kolor = Color.BLACK; 

    public NewSlider (Color k) {  
     kolor = k; 
     updateUI(); 
    } 

    public void updateUI() { 
     setUI(new NewSliderUI(this, kolor); 
     updateLabelUIs(); 
    } 
} 

Vous finissez par appeler updateUI() deux fois, mais le résultat final devrait être ce que vous voulez.

+0

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

+0

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

+0

Oui, cela semble être ce qui se passe. Dites-moi comment ça finit! –

Questions connexes