Расширение виджетов Java Swing (хотите добавить анимацию и дополнительные маркеры в JSlider) - PullRequest
2 голосов
/ 02 ноября 2011

Я заинтересован в создании нового виджета, похожего на виджет JSlider, но с ручкой «призрак» (полупрозрачный), отображающей предыдущее положение ползунка, а также добавлением анимации в виде следов к движению реальной ручки.

Я немного озадачен правильным способом расширения виджета Java Swing для добавления новых функций.

На мой взгляд, у меня есть несколько вариантов:

1) Расширить JSlider, разместите здесь всю информацию о моей новой модели и перезаписайте краску, чтобы сначала нарисовать JSlider, а затем наложить мои желаемые дополнения.Проблема с этим решением заключается в том, что мне нужно было бы использовать метод проб и ошибок, чтобы получить метки в правильном положении (поскольку у меня не будет доступа к полной геометрической информации), что может привести к тому, что оно не будет работать во всех ситуациях.

2) Расширить различные классы виджета Slider (JSlider, SliderUI, BasicSliderUI, MetalSliderUI, BoundedRangeModel, DefaultBoundedRangeModel).Преимущество, которое я вижу здесь, заключается в поддержании правильной архитектуры модель-представление-контроллер.Однако это потребует перегрузки различных функций внутри классов.Я считаю, что результат может показаться очень взломанным вместе.

3) Копирование всего кода виджета Slider и изменение для создания моего нового виджета.Это было бы похоже на options (2), но может быть немного проще изменить код, чем расширять функции (которые будут в основном копировать / модифицировать код в любом случае).

4) Повторно создайте виджет-слайдер изпоцарапайте с моей желаемой функциональностью.После просмотра кода существующего виджета Swing Slider, это не тривиальная задача.

Не хватает ли мне более элегантного метода создания нового виджета, который заимствует функциональность из существующего?

СпасибоВы для вашего понимания.

1 Ответ

2 голосов
/ 02 ноября 2011

Я бы выбрал 2) с некоторыми изменениями Создайте WrapperSliderUI класс, который делегирует все вызовы методов пользовательскому интерфейсу делегата. И переопределить только метод рисования.

SetUI вашего JSlider должен обернуть оригинальный интерфейс в WrapperSliderUI

public void setUI(SliderUI ui) {
    super.setUI(new WrapperSliderUI(ui));
}

На рисунке вы проверите исходный класс пользовательского интерфейса и соответствующим образом адаптируете свою картину.

...