⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 table.scala

📁 JAVA 语言的函数式编程扩展
💻 SCALA
字号:
package scala.swingimport model.Matriximport javax.swing._import javax.swing.table._import javax.swing.event._import java.awt.{Dimension, Color}import event._import scala.collection.mutable.Setobject Table {  object AutoResizeMode extends Enumeration {    import JTable._    val Off = Value(AUTO_RESIZE_OFF, "Off")    val NextColumn = Value(AUTO_RESIZE_NEXT_COLUMN, "NextColumn")    val SubsequentColumns = Value(AUTO_RESIZE_SUBSEQUENT_COLUMNS, "SubsequentColumns")    val LastColumn = Value(AUTO_RESIZE_LAST_COLUMN, "LastColumn")    val AllColumns = Value(AUTO_RESIZE_ALL_COLUMNS, "AllColumns")  }    object IntervalMode extends Enumeration {    val Single = Value(ListSelectionModel.SINGLE_SELECTION)    val SingleInterval = Value(ListSelectionModel.SINGLE_INTERVAL_SELECTION)    val MultiInterval = Value(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)  }  object ElementMode extends Enumeration {    val Row, Column, Cell, None = Value  }}/** * @see javax.swing.JTable */class Table(override val peer: JTable) extends Component(peer) with Scrollable with Publisher {  import Table._  def this() = this(new JTable())  def this(numRows: Int, numColumns: Int) = this(new JTable(numRows, numColumns))  def this(rowData: Array[Array[AnyRef]], columnNames: Array[AnyRef]) = this(new JTable(rowData, columnNames))  //todo: create constructor with List[List[Any]]  def this(dm: TableModel) = this(new JTable(dm))  def this(dm: TableModel, cm: TableColumnModel) = this(new JTable(dm, cm))  def this(dm: TableModel, cm: TableColumnModel, sm: ListSelectionModel) = this(new JTable(dm, cm, sm))    protected def scrollablePeer = peer    def rowHeight = peer.getRowHeight  def rowHeight_=(x: Int) = peer.setRowHeight(x)    def rowCount = peer.getRowCount    def model = peer.getModel()  def model_=(x: TableModel) = peer.setModel(x)    def autoResizeMode: AutoResizeMode.Value = AutoResizeMode(peer.getAutoResizeMode)  def autoResizeMode_=(x: Table.AutoResizeMode.Value) = peer.setAutoResizeMode(x.id)    def showGrid = peer.getShowHorizontalLines && peer.getShowVerticalLines  def showGrid_=(grid: Boolean) = peer.setShowGrid(grid)    def gridColor = peer.getGridColor  def gridColor_=(color: Color) = peer.setGridColor(color)    def preferredViewportSize_=(dim: Dimension) = peer.setPreferredScrollableViewportSize(dim)  //1.6: def fillsViewportHeight: Boolean = peer.getFillsViewportHeight  //def fillsViewportHeight_=(b: Boolean) = peer.setFillsViewportHeight(b)    // TODO: could be a sorted set  protected abstract class SelectionSet[A](a: =>Seq[A]) extends Set[A] {     def -=(n: A)     def +=(n: A)     def contains(n: A) = a.contains(n)    def size = a.length    def elements = a.elements  }    class Selection extends Publisher {    object rows extends SelectionSet(peer.getSelectedRows) {      def -=(n: Int) { peer.removeRowSelectionInterval(n,n) }      def +=(n: Int) { peer.addRowSelectionInterval(n,n) }            def leadIndex: Int = peer.getSelectionModel.getLeadSelectionIndex      def anchorIndex: Int = peer.getSelectionModel.getAnchorSelectionIndex    }        object columns extends SelectionSet(peer.getSelectedColumns) {       def -=(n: Int) { peer.removeColumnSelectionInterval(n,n) }      def +=(n: Int) { peer.addColumnSelectionInterval(n,n) }            def leadIndex: Int = peer.getColumnModel.getSelectionModel.getLeadSelectionIndex      def anchorIndex: Int = peer.getColumnModel.getSelectionModel.getAnchorSelectionIndex    }    def cells: Set[(Int, Int)] =       new SelectionSet[(Int, Int)]((for(r <- selection.rows; c <- selection.columns) yield (r,c)).toSeq) { outer =>        def -=(n: (Int, Int)) {           peer.removeRowSelectionInterval(n._1,n._1)          peer.removeColumnSelectionInterval(n._2,n._2)         }        def +=(n: (Int, Int)) {           peer.addRowSelectionInterval(n._1,n._1)          peer.addColumnSelectionInterval(n._2,n._2)         }        override def size = peer.getSelectedRowCount * peer.getSelectedColumnCount      }        /**     * From the JTable Swing tutorial:      * You can specify selection by cell in multiple interval selection mode,      * but the result is a table that does not produce useful selections.     */    def intervalMode: IntervalMode.Value = IntervalMode(peer.getSelectionModel.getSelectionMode)    def intervalMode_=(m: IntervalMode.Value) { peer.getSelectionModel.setSelectionMode(m.id) }    def elementMode: ElementMode.Value =       if(peer.getColumnSelectionAllowed && peer.getRowSelectionAllowed) ElementMode.Cell      else if(peer.getColumnSelectionAllowed) ElementMode.Column      else if(peer.getRowSelectionAllowed) ElementMode.Row      else ElementMode.None    def elementMode_=(m: ElementMode.Value) {      m match {        case ElementMode.Cell => peer.setCellSelectionEnabled(true)        case ElementMode.Column => peer.setRowSelectionAllowed(false); peer.setColumnSelectionAllowed(true)        case ElementMode.Row => peer.setRowSelectionAllowed(true); peer.setColumnSelectionAllowed(false)        case ElementMode.None => peer.setRowSelectionAllowed(false); peer.setColumnSelectionAllowed(false)      }    }        peer.getColumnModel.getSelectionModel.addListSelectionListener(new ListSelectionListener {      def valueChanged(e: javax.swing.event.ListSelectionEvent) {        publish(ColumnsSelected(Table.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting))      }    })    peer.getSelectionModel.addListSelectionListener(new ListSelectionListener {      def valueChanged(e: javax.swing.event.ListSelectionEvent) {        publish(RowsSelected(Table.this, e.getFirstIndex to e.getLastIndex, e.getValueIsAdjusting))      }    })  }    val selection: Selection = new Selection       private val initialRenderer = peer.getDefaultRenderer(classOf[AnyRef])    /**   * Supplies a renderer component for a given cell.   */  protected def render(isSelected: Boolean, hasFocus: Boolean, row: Int, column: Int): Component =     new Component {       override lazy val peer = initialRenderer.getTableCellRendererComponent(Table.this.peer,                  Table.this.peer.getValueAt(row, column), isSelected, hasFocus, row, column).asInstanceOf[JComponent]    }   peer.setDefaultRenderer(classOf[AnyRef], new TableCellRenderer {    def getTableCellRendererComponent(tabBlockIle: JTable, value: AnyRef, isSelected: Boolean, hasFocus: Boolean, row: Int, column: Int) =       render(isSelected, hasFocus, row, column).peer  })  def apply(row: Int, column: Int) = peer.getValueAt(row, column)  def update(row: Int, column: Int, value: AnyRef) = peer.setValueAt(value, row, column)  def markUpdated(row: Int, column: Int) = update(row, column, apply(row, column))      /*    peer.addActionListener {    new java.awt.event.ActionListener {      def actionPerformed(e: java.awt.event.ActionEvent): unit =         publish(ButtonPressed(Button.this))    }  }*/  model.addTableModelListener(new TableModelListener {    def tableChanged(event: TableModelEvent) = publish(      if (event.getType == TableModelEvent.UPDATE)        TableChanged(Table.this, event.getFirstRow, event.getLastRow, event.getColumn)      else            	TableResized(Table.this)    )  })}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -