Пользовательская проблема инициализации Jslider - PullRequest
1 голос
/ 26 января 2010

Я работаю над пользовательским JSlider, у которого есть собственный Track Rectangle. Мне нужна возможность установить цвет прямоугольника дорожки при первом объявлении слайдера.

Вот фрагмент того, что у меня есть (классы находятся в отдельных файлах в одном пакете):

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;
   }

} 

В приведенном выше коде "kolor" изначально имеет значение null и приводит к ошибке, когда NewSliderUI пытается его использовать. Похоже, что метод updateUI() вызывается раньше всего. Затем вызывается конструктор NewSlider. Я пробовал разные вещи, но поскольку updateUI () запускается раньше всего, кажется, ничего из того, что я добавляю в класс NewSlider.

Если я жестко закодирую Цвет (т.е. setUI(new NewSliderUI(this, Color.BLACK);), то он работает, но иметь разные классы для каждого цвета кажется глупым.

Спасибо.

1 Ответ

1 голос
/ 26 января 2010

Я не вижу, как kolor может быть нулевым, если не происходит одно из следующих действий:

  1. Вы передаете нулевое значение конструктору
  2. Вы не создаете экземпляр NewSlider в Swing EDT и у вас возникают странные проблемы с кешем
  3. NewSlider создается с помощью отражения / десериализации, а цвет не устанавливается.

Вы пытались запустить это в отладчике с некоторыми точками останова? Мне было бы любопытно убедиться, что конструктор NewSlider вызывается (и до конструктора NewSliderUI).

Редактировать: я понимаю, что вы имеете в виду ниже. Я забыл, что конструктор no args для JSlider вызывался неявно. Как насчет следующих действий:

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();
   }
}

В итоге вы дважды вызываете updateUI (), но конечный результат должен быть таким, какой вы хотите.

...