dsg*_*dsg 4 swing drag-and-drop resize scala position
我正在寻找一个scala特征,我可以将其混合到一个scala.swing.Component允许使用鼠标输入定位和调整大小的组件.
理想情况下,它会添加小框作为"句柄",以向用户指示可以调整组件的大小:

我觉得这是一个相当普遍的任务,应该有一些支持它的特征.
我在我目前的项目中使用这些.您可能需要使用自己的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)
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |