ventana una tamaƱo responsiva resizing redimensionar hacer como cambiar boton swing scala drag-and-drop resize position

swing - una - redimensionar jpanel java



scala swing: rasgo de componente arrastrable/redimensionable (2)

Estoy buscando un rasgo de scala que pueda mezclar en un scala.swing.Component que permita posicionar y cambiar el tamaño de ese componente con la entrada del mouse.

Lo ideal sería agregar pequeños cuadros como "identificadores" para indicar al usuario que el componente puede redimensionarse:

Siento que esta es una tarea bastante común, y debe haber algunos rasgos que la respalden.


El único Componente que conozco es Dragable y redimensionable es el InternalFrame en JDesktop. Aquí hay un ejemplo:

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) } }

pero tanto JInternalFrame como JDesktop no están integrados en el paquete scala swing y deben envolverse manualmente.


Estoy usando estos en mi proyecto actual. Probablemente necesites reemplazar la biblioteca Vector por la tuya y agregar implicid defs. O usa Punto / Dimensión desde el swing. Los componentes deben estar en un panel que permita posiciones y tamaños personalizados, como NullPanel desde 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 } }