我正在寻找一个scala特性,我可以混合到一个scala.swing.Component
,这将允许使用鼠标输入定位和调整大小。scala swing:可拖动/可调整大小的组件特性
理想情况下,会增加小盒子为“手柄”,以指示该组件可以调整用户:
我觉得这是一个相当普遍的任务,应该有一些特质在那里支持它。
我正在寻找一个scala特性,我可以混合到一个scala.swing.Component
,这将允许使用鼠标输入定位和调整大小。scala swing:可拖动/可调整大小的组件特性
理想情况下,会增加小盒子为“手柄”,以指示该组件可以调整用户:
我觉得这是一个相当普遍的任务,应该有一些特质在那里支持它。
我在我目前的项目中使用这些。您可能需要用自己的库替换Vector库并添加隐含的defs。或者使用来自挥杆的点/维度。该组件需要在一个面板,允许自定义的位置和大小,像NullPanel从http://dgronau.wordpress.com/2010/08/28/eine-frage-des-layouts/
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
}
}
这些非常有用,谢谢! – evilcandybag 2013-11-10 16:07:18
我知道的唯一一个组件是Dragable,可调整大小是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包中,需要手动打包。
我认为这可以通过一些特殊的面板/布局来实现,而不是直接在组件的大小和位置一个组件取决于您将其放入的面板类型。 – gerferra 2011-04-25 10:32:27