2012-02-13 2 views
4

Я пытаюсь добавить ScrollBar. ScrollBar будет перебирать отображаемые документы. Тем не менее, у меня возникают проблемы с получением события при изменении полосы прокрутки. Я не уверен, что мне нужно слушать, и я не уверен, на какое событие я должен отвечать. Я попробовал следующее, и у меня есть некоторые события, но я не думаю, что это идеальные события для обработки.Ручка свинг ScrollBar события в scala

listenTo(scrollBar) 
    listenTo(scrollBar.keys) 
    listenTo(scrollBar.mouse.moves) 
    listenTo(scrollBar.mouse.wheel) 
    listenTo(scrollBar.mouse.clicks) 

Например, я получаю только MouseClickedMousePressed, и MouseReleased, когда я нажимаю внутри скроллинга - не тогда, когда я нажимаю на стрелки, чтобы фактически изменить значение.

Я нашел this discussion о полосах прокрутки, которые не принимают события должным образом, но это два года. Насколько я могу судить, автор не проследил за файлом билет. Возможно, он нашел обходное решение.

Любые идеи?

+0

Вы можете загрузить весь код? и вы не можете добавить полосу прокрутки в окно, которое является контейнером верхнего уровня. – unknown

+0

Я добавляю полосу прокрутки в контейнер. – schmmd

ответ

1

Хороший вопрос. Нажатие на стрелки не обрабатывается ScrollBar, оно обрабатывается ScrollBarUI. Я считаю, что реализация по умолчанию (или, по крайней мере, базовый класс для большинства реализаций ScrollBarUI) равна BasicScrollBarUI.

Если вы изучите источник javax.swing.plaf.basic.BasicScrollBarUI, у него есть кнопки incrButton и decrButton, и они являются компонентами, которые вы хотите слушать.

P.S. У меня была аналогичная потребность в том, что у меня был пользовательский (ключевой) прослушиватель для моего Slider и пользовательский ui, который предоставляет необходимые компоненты/модель (как вы могли видеть, почти все компоненты защищены, поэтому вы легко могли получить доступ к ним в подклассах и разоблачить через публичные геттеры) отлично поработали для меня. Я сделал это в простой Java, хотя, может быть, в scala вы можете слушать кнопки только путем определения имени свойства.

0

Еще один кусок Scala Swing сломан. Черта Adjustable кажется полностью пустой, ничего не подключено.

следующие работы:

class ScrollBarAlive extends swing.ScrollBar { 
    me => 
    peer.addAdjustmentListener(new java.awt.event.AdjustmentListener { 
    def adjustmentValueChanged(e: java.awt.event.AdjustmentEvent) { 
     publish(new swing.event.ValueChanged(me)) 
    } 
    }) 
} 

Тест:

import swing._ 

object ScrollBarTest extends SimpleSwingApplication { 
    lazy val top = new Frame { 
    val label = new Label { text = "0" } 
    val scroll = new ScrollBarAlive { 
     orientation = Orientation.Horizontal 
     listenTo(this) 
     reactions += { 
     case event.ValueChanged(_) => 
      label.text = value.toString + (if (valueIsAjusting) " A" else "") 
     } 
    } 
    contents = new BorderPanel { 
     add(label, BorderPanel.Position.North) 
     add(scroll, BorderPanel.Position.South) 
    } 
    pack().centerOnScreen() 
    open() 
    } 
} 

Надлежащая реализация будет также ввести подтип AdjustingEvent.

Смежные вопросы