Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala swing:可拖动/可调整大小的组件特性_Swing_Scala_Drag And Drop_Resize_Position - Fatal编程技术网

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

scala swing:可拖动/可调整大小的组件特性,swing,scala,drag-and-drop,resize,position,Swing,Scala,Drag And Drop,Resize,Position,我正在寻找一种scala特性,我可以将它混合到scala.swing.Component中,它允许使用鼠标输入定位和调整组件的大小 理想情况下,它会添加小框作为“句柄”,以向用户指示可以调整组件的大小: 我觉得这是一个相当常见的任务,应该有一些特性支持它。我所知道的唯一一个可以拖动和调整大小的组件是JDesktop上的InternalFrame。以下是一个例子: import swing._ import event._ import javax.swing.{UIManager,JComp

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

理想情况下,它会添加小框作为“句柄”,以向用户指示可以调整组件的大小:


我觉得这是一个相当常见的任务,应该有一些特性支持它。

我所知道的唯一一个可以拖动和调整大小的组件是JDesktop上的InternalFrame。以下是一个例子:

import swing._
import event._

import javax.swing.{UIManager,JComponent}
import javax.swing.KeyStroke.getKeyStroke
import java.awt.{Graphics2D,Graphics}

object InternalFrameDemo extends SimpleSwingApplication{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName)

    val top = new MainFrame{
        title = "InternalFrameDemo"
        preferredSize = new Dimension(640,480)
        val desktop = new javax.swing.JDesktopPane

        val jc = new JComponent{
            override def paint(g:Graphics){
                import g._
                drawLine(0,0,20,20)
                drawLine(0,20,20,0)
                println("yay draw")
            }

            setVisible(true)
        }

        desktop add jc

        contents = Component.wrap(desktop)

        menuBar = new MenuBar{
            contents += new Menu("Document"){
                mnemonic = Key.D

                contents += new MenuItem("New"){
                    mnemonic = Key.N
                    action = new Action("new"){
                        def apply = createFrame
                        accelerator = Some(getKeyStroke("alt N"))
                    }
                }

                contents += new MenuItem("Quit"){
                    mnemonic = Key.Q
                    action = new Action("quit"){
                        def apply(){
                            quit()
                        }
                        accelerator = Some(getKeyStroke("alt Q"))
                    }
                }
            }
        }

        def createFrame{
            val newFrame = MyInternalFrame()
            newFrame setVisible true
            desktop add newFrame
            newFrame setSelected true

        }
    }
}

import javax.swing.{JDesktopPane,JInternalFrame}
import collection.mutable.ArrayBuffer

object MyInternalFrame{
    var openFrameCount = 0;
    val xOffset, yOffset = 30;

    def apply() = {
        openFrameCount += 1
        val jframe = new javax.swing.JInternalFrame("Document #" + openFrameCount,true,true,true,true)

        jframe.setSize(300,300)
        jframe.setLocation(xOffset*openFrameCount,yOffset*openFrameCount)

        jframe //Component.wrap(jframe)
    }
}

但是JInternalFrame和JDesktop都没有集成到scala swing包中,需要手动包装。

我在当前项目中使用它们。您可能需要将向量库替换为自己的,并添加隐式def。或者使用swing中的点/尺寸标注。组件需要位于允许自定义位置和大小的面板中,如来自的NullPanel

trait可移动扩展组件{
var dragstart:Vec2i=null
listenTo(鼠标点击,鼠标移动)
反应+={
案例e:鼠标标记=>
if(dragstart!=null)
peer.setLocation(位置-dragstart+e.point)
案例e:鼠标按下=>
这场比赛{
案例组件:可调整大小=>
if(component.resizestart==null)
dragstart=e.point
案例=>
dragstart=e.point
}
案例e:MouseReleased=>
dragstart=null
}
}
可调整特征大小的扩展组件{
var resizestart:Vec2i=null
变量oldsize=Vec2i(0)
def大小调整(增量:Vec2i){}
listenTo(鼠标点击,鼠标移动)
反应+={
案例e:鼠标标记=>
if(resizestart!=null){
val delta=e.point-调整大小开始
对等设置大小(最大值(旧尺寸+增量,最小尺寸))
oldsize+=delta
resizestart+=增量
调整大小(增量)
重新验证
}
案例e:鼠标按下=>
如果(尺寸宽度-e点x<15
&&尺寸.高度-e.点y<15){
resizestart=e.point
oldsize=大小
这场比赛{
外壳组件:可移动=>
component.dragstart=null
案例=>
}
}
案例e:MouseReleased=>
resizestart=null
}
}

我认为这可以通过一些特殊的面板/布局来实现,但不能直接在组件上实现,组件的大小和位置取决于您放入的面板类型。