Обработка событий свинга ScrollBar в Scala - PullRequest
4 голосов
/ 14 февраля 2012

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

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

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

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

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

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

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

0 голосов
/ 15 апреля 2013

Еще один кусок 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.

...