【问题标题】:Scala swing table - capturing column clicksScala 摆动表 - 捕获列点击
【发布时间】:2010-11-03 22:33:05
【问题描述】:

我对 swing 和 scala 都很陌生,但是我试图捕获在 scala.swing.Table 中单击列的时间,但我一直无法弄清楚如何做到这一点。可以在scala中完成吗?我仍在学习如何阅读 scala API,所以任何见解都会有所帮助,

【问题讨论】:

  • 您要捕获随机 clic 还是要获取选定的行和/或列?
  • 对不起,我后来意识到我应该更具体。我在这里(stackoverflow.com/questions/2342173/…)读到 scala 表不支持排序,所以我想编写自己的实现,但我无法确定何时单击列标题。

标签: scala swing


【解决方案1】:

看起来 Scala Swing 还不支持表头事件,因此您可能必须执行以下操作,将鼠标侦听器直接添加到 JTableHeader

我确信有一种优雅的方法可以创建 scala.swing.Publisher 以将侦听器与 listenToreactions 集成机制,这仅取决于是否值得付出额外的努力。

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 事件提供的范围信息相当奇怪,它包含从当前单击到不同列中的上一次单击的连续列索引。也许我错过了为什么。

【讨论】:

  • 感谢您抽出宝贵时间回答我的问题。这应该可以满足我的需要。
  • 我能够以您的示例并使其与 scala Publisher 和 Reactors 一起使用,请参阅我的答案。它并不完美,但可以满足我的需求,再次感谢您的帮助。
  • 很高兴能够提供帮助。我没有意识到出版是如此容易。
【解决方案2】:

我能够以 Don Mackenzie 为例,使用 Publisher 和 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)

【讨论】:

    【解决方案3】:

    请不要编写您自己的表格排序实现 - 请改用GlazedLists。你会感谢我的。您可能需要使用标准 JTable 而不是 swing.Table,但它可以处理您必须执行的所有排序和过滤。

    【讨论】:

    • 哇,我以前从未见过那个库。我玩了一会儿,但最后我主要使用纯 java 和 java swing 代码,这不是我玩 scala 的重点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多