Scala Swing: перетаскиваемая / изменяемая характеристика компонента - PullRequest
4 голосов
/ 23 апреля 2011

Я ищу черту scala, которую я могу смешать с scala.swing.Component, которая позволит позиционировать и изменять размер этого компонента с помощью мыши.

В идеале было бы добавить маленькие прямоугольники в качестве «ручек», чтобы указать пользователю, что размер компонента может быть изменен: enter image description here

Я чувствую, что это довольно распространенная задача, и должны быть некоторые черты, поддерживающие ее.

Ответы [ 2 ]

5 голосов
/ 08 августа 2011

Я использую их в моем текущем проекте.Возможно, вам придется заменить библиотеку Vector своей собственной и добавить неявные определения.Или используйте Point / Dimension из свинга.Компоненты должны находиться на панели, которая позволяет настраивать позиции и размеры, например, 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
    }
}
0 голосов
/ 29 мая 2011

Единственный известный мне компонент - Dragable и resizeable - это InternalFrame на JDesktop. Вот пример:

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 и должны быть упакованы вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...