如何在JavaFX画布上绘制可选择的,可移动的和可调整大小的矩形?

时间:2016-06-27 05:26:29

标签: java user-interface javafx adaptive-user-interfaces

有没有办法允许用户在JavaFX和/或画布中绘制可单独选择的,可移动的和可重新调整大小的形状,而我没有考虑或意识到这些形状?

我是JavaFX的新手(实际上是Java GUI),我正在尝试设计一种允许用户在窗格/工作区/页面上绘制(单击并拖动)最多100个矩形的方法。我也在寻找一种方法来实现这种可扩展性,但现在保持静态比例会很好。我在搜索中没有找到大量类似的例子,其中大多数只探索其中一个选项,但遗漏了我需要完成的某些事情。通常它们显示预定义的节点或画布形状,这些节点或画布形状不可单独使用。所以我试图找到实现这一目标的最佳方法。

绘制形状不是问题,我知道如何做到这一点。它使它们成为工作区内的单个对象(可选择,可移动,可调整大小)。

我目前的想法是创建一个Javafx窗格,然后在窗格中创建100个画布作为预定义图层,这些图层与整个工作区的尺寸相同。每个绘制的矩形将占据其中一个图层/画布。选择每个矩形将涉及图层中绘制的矩形内的单击事件,允许用户编辑,(移动,重新调整大小等)

以下Oracle教程是我对这种分层方法的看法。 http://docs.oracle.com/javafx/2/canvas/jfxpub-canvas.htm

我觉得这种方法的工作前提是有缺陷的。一个原因是它需要预定义数量的层。虽然我想要限制它,但它不是很有活力。但大多数情况下,它似乎很复杂。

我对缺乏代码以及问题的概念性质表示歉意,但我一直在搜索和试验(未成功)几周。任何帮助或见解将不胜感激。

谢谢

项目背景 我正在创建一个基本的表单创建者。用户(在创建模式下)将拖动与对应对象相关联的一系列矩形,指示每个矩形的某些属性,坐标和尺寸。将保存并使用此数据(在表单模式下)以放置文本字段以供表单使用。无论在工作区上绘制矩形的哪个位置,相同位置和尺寸的文本字段都将放置在表单上。

1 个答案:

答案 0 :(得分:0)

我能想到的最简单的方法是创建一个组,并按需向组添加矩形。然后,您可以将变换和鼠标滑块附加到每个矩形,并使其具有以便在检测到拖动时更新变换的属性。我在这里整理了一个简单的演示。使用右键单击制作矩形,使用鼠标左键拖动以调整大小,使用鼠标中键拖动以移动矩形。

Group root = new Group();
    Scene scene = new Scene(root, 1080, 720, true);
    scene.addEventFilter(MouseEvent.MOUSE_PRESSED,e->{
        if(e.getButton()==MouseButton.SECONDARY)
        {
            //make a new rectangle
            Rectangle rect = new Rectangle(100,100);
            root.getChildren().add(rect);
            rect.setFill(Color.CYAN);
            Scale scaler = new Scale(1,1);
            Translate locationCenter = new Translate(e.getX(),e.getY());
            rect.getTransforms().add(locationCenter);
            rect.getTransforms().add(scaler);
            rect.getTransforms().add(new Translate(-50,-50));
            //listen for left mouse drags
            rect.addEventFilter(MouseEvent.MOUSE_DRAGGED, e2->{
                if(e2.getButton()==MouseButton.PRIMARY)
                {
                    //resize with left drag
                    double scaleX=e2.getSceneX()-rect.localToParent(0,0).getX();
                    double scaleY=e2.getSceneY()-rect.localToParent(0,0).getY();
                    scaler.setX(scaleX/100);
                    scaler.setY(scaleY/100);
                } else if(e2.getButton()==MouseButton.MIDDLE)
                {
                    //move with middle drag
                    locationCenter.setX(e2.getSceneX());
                    locationCenter.setY(e2.getSceneY());
                }
            });
        }
    });