Стол качания Scala - захват кликов колонки - PullRequest
1 голос
/ 04 ноября 2010

Я довольно новичок как в Swing, так и в Scala, но я пытаюсь запечатлеть, когда столбец щелкается в таблице scala.swing.Table, и я не смог понять, как это сделать. Это можно сделать в скале? Я все еще учусь читать API Scala, поэтому любая информация будет полезна,

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Похоже, что Scala Swing пока не поддерживает события заголовка таблицы, поэтому вам, возможно, придется сделать что-то вроде следующего, которое добавляет слушателя мыши непосредственно к JTableHeader .

Я уверен, что существует элегантный способ создания scala.swing.Publisher для интеграции слушателя с реакциями listenTo и механизм, это просто зависит, если оно того стоит.

import java.awt.Dimension

import java.awt.event.{MouseEvent, MouseAdapter}
import swing._
import event.TableColumnsSelected

object TableQuestion extends SimpleSwingApplication {
  val headers = Array.tabulate(10){"Col-"+_}.toSeq
  val rowData = Array.tabulate[Any](10, 10){""+_+":"+_}

  lazy val ui = new BoxPanel(Orientation.Vertical) {
    val table  = new Table(rowData, headers)
    val label  = new Label("")
    val header = table.peer.getTableHeader()

    header.addMouseListener(new MouseAdapter() {
      override def mouseClicked(e: MouseEvent) {
        val col = header.columnAtPoint(e.getPoint())

        label.text = "Column header "+col+" selected"
      }
    })    

    listenTo(table.selection)

    reactions += {
      case TableColumnsSelected(_, r, _) =>
        label.text = "Column "+table.selection.columns.leadIndex+" selected, range = "+r
    }
    contents  += new ScrollPane(table)
    contents  += label
  }

  def top = new MainFrame {
    title         = "Table Column Selection"
    preferredSize = new Dimension(400, 260)
    contents      = ui
  }
}

Кроме того, информация о диапазоне, предоставляемая событием TableColumnSelected, довольно странная, она содержит непрерывные индексы столбцов от текущего клика до предыдущего клика вдругой столбец.Возможно, я чего-то не понимаю, почему.

1 голос
/ 05 ноября 2010

Мне удалось взять пример Дона Маккензи и произвести что-то, используя Publisher and Reactor.

import java.awt.event.{MouseEvent, MouseAdapter}
import javax.swing.UIManager
import swing._
import event.TableEvent

object TableQuestion extends SimpleSwingApplication
{
  val headers = Array.tabulate(10) {"Col-" + _}.toSeq
  val rowData = Array.tabulate[Any](10, 10) {"" + _ + ":" + _}

  lazy val ui = new BoxPanel(Orientation.Vertical) {
  val table = new Table(rowData, headers)
  val label = new Label("")
  val header = table.peer.getTableHeader()

  header.addMouseListener(new MouseAdapter() {
    override def mouseClicked(e: MouseEvent) {
       publish(ColumnHeaderClicked(table, header.columnAtPoint(e.getPoint())))
    }
  })

  listenTo(table)

  reactions += {
    case ColumnHeaderClicked(_, column) => label.text = "Column header " + column + " selected"
  }
  contents += new ScrollPane(table)
  contents += label
}

  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName);
  def top = new MainFrame {
    title = "Table Column Selection"
    preferredSize = new Dimension(400, 260)
    contents = ui
  }
}   

case class ColumnHeaderClicked(override val source: Table, column: Int) extends TableEvent(source)
0 голосов
/ 04 ноября 2010

Пожалуйста, не пишите свою собственную реализацию сортировки таблиц - используйте GlazedLists . Ты поблагодаришь меня. Возможно, вам придется использовать стандартный JTable, а не swing.Table, но он может обрабатывать всю сортировку и фильтрацию, которые вам когда-либо понадобятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...