Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala Swing ListView's Remove / Add Elements Events

With reference to this,

How do I change the contents of a ListView in Scala?

I could change ListView contents by changing listData. However, I couldn't get ListView to publish these events, ListElementsAdded, ListElementsAdded and ListChanged. From the looks of ListView source, it would only adds a listener to a read-only empty model. How do I go about this?

Thanks

like image 946
thlim Avatar asked Nov 05 '22 16:11

thlim


1 Answers

Later on, I managed to figure out a way to have ListView published these events., please refer to the code.

Is the right to go about it? Is there a better way to do this? Please advise.

Thanks

** code borrowed and modified **

object ListViewTest extends SimpleSwingApplication
{
  lazy val top = new MainFrame
  {
    title = "ListView Test"
    contents = new BoxPanel(Orientation.Vertical)
    {
      border = Swing.EmptyBorder(2, 2, 2, 2)

      val listModel = new DefaultListModel
      List("First", "Second", "Third", "Fourth", "Fifth").map(listModel.addElement(_))
      val myList = ListBuffer()
      val listView = new ListView[String](myList)
      {
        selection.intervalMode = ListView.IntervalMode.Single
        peer.setModel(listModel)

        //listData = myList

      }
      listView.peer.getModel.addListDataListener(new ListDataListener {
        def contentsChanged(e: ListDataEvent) { publish(ListChanged(listView)) }
        def intervalRemoved(e: ListDataEvent) { publish(ListElementsRemoved(listView, e.getIndex0 to e.getIndex1)) }
        def intervalAdded(e: ListDataEvent) { publish(ListElementsAdded(listView, e.getIndex0 to e.getIndex1)) }
      })

      contents += new ScrollPane(listView)

      val label = new Label("No selection")
      contents += label

      val b = new Button("Remove")
      contents += b

      listenTo(listView.selection, listView, b)
      reactions +=
        {
          case ListSelectionChanged(list, range, live) =>
            label.text = "Selection: " + range
          case e: ButtonClicked =>
            if (listView.listData.isEmpty)
            {
              b.enabled = false
            }
            else
            {
              listView.peer.getModel.asInstanceOf[DefaultListModel].remove(listView.selection.anchorIndex)
            }

          case ListElementsRemoved(source, range) =>
            println("Element at " + (range.start + 1) + " is removed.")
        }
    }
    pack
  }
like image 196
thlim Avatar answered Nov 15 '22 06:11

thlim