scala swing:可拖动/可调整大小的组件特征

dsg*_*dsg 4 swing drag-and-drop resize scala position

我正在寻找一个scala特征,我可以将其混合到一个scala.swing.Component允许使用鼠标输入定位和调整大小的组件.

理想情况下,它会添加小框作为"句柄",以向用户指示可以调整组件的大小: 在此输入图像描述

我觉得这是一个相当普遍的任务,应该有一些支持它的特征.

man*_*man 5

我在我目前的项目中使用这些.您可能需要使用自己的Vector库替换Vector库并添加含义defs.或者从挥杆中使用点/尺寸.组件需要位于允许自定义位置和大小的面板中,例如来自http://dgronau.wordpress.com/2010/08/28/eine-frage-des-layouts/的 NullPanel

trait Movable extends Component{
    var dragstart:Vec2i = null
    listenTo(mouse.clicks, mouse.moves)
    reactions += {
        case e:MouseDragged =>
            if( dragstart != null )
                peer.setLocation(location - dragstart + e.point)
        case e:MousePressed =>
            this match {
                case component:Resizable =>
                    if( component.resizestart == null )
                        dragstart = e.point
                case _ =>
                    dragstart = e.point

            }
        case e:MouseReleased =>
            dragstart = null    
    }
}

trait Resizable extends Component{
    var resizestart:Vec2i = null
    var oldsize = Vec2i(0)
    def resized(delta:Vec2i) {}
    listenTo(mouse.clicks, mouse.moves)
    reactions += {
        case e:MouseDragged =>
            if( resizestart != null ){
                val delta = e.point - resizestart
                peer.setSize(max(oldsize + delta, minimumSize))

                oldsize += delta
                resizestart += delta

                resized(delta)
                revalidate
            }
        case e:MousePressed =>
            if( size.width - e.point.x < 15
             && size.height - e.point.y < 15 ){
                resizestart = e.point
                oldsize = size

                this match {
                    case component:Movable =>
                        component.dragstart = null
                    case _ =>
                }
            }
        case e:MouseReleased =>
            resizestart = null
    }
}
Run Code Online (Sandbox Code Playgroud)