当前位置: 首页 > 知识库问答 >
问题:

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

巢宏富
2023-03-14

是否有一种方法允许用户在JavaFX和/或画布中绘制我没有考虑或意识到的可单独选择、可移动和可重新调整大小的形状?

我是JavaFX(实际上JavaGUI)的新手,并且正在尝试设计一种允许用户绘制的方法(单击

画形状不是问题,我知道怎么做。它使它们成为工作空间中的单个对象(可选、可移动、可重新调整大小)。

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

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

我觉得这个方法的工作前提是有缺陷的。一个原因是它需要预定义的层数。虽然我想限制这一点,但它不是很动态。但大多数情况下,它看起来很复杂。

我为缺少代码和问题的概念性道歉,但是我已经搜索和实验了几个星期(不成功)。任何帮助或洞察力都将不胜感激。

非常感谢。

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

共有1个答案

厍书
2023-03-14

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

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());
                }
            });
        }
    });
 类似资料:
  • 我有一个问题已经部分解决了,但我很好奇另一个(更好的)解决方法…我想要一个画布,什么填充整个窗口,并调整自己的大小,如果窗口的大小。 根据这个:https://dlemmermann.wordpress.com/2014/04/10/javafx-tip-1-resizable-canvas/和这个:如何在JavaFX中使canvas可调整大小?我已创建(复制)类: 并将以下内容放入viewfie

  • 我编写了这段代码,可以在JavaFX画布上绘制。它可以很好地工作,但我不知道如何重新绘制画布(比如在Swing中),以便在新画布上重新开始绘制。这是我的代码,非常感谢你的帮助!马里奥

  • 我是Android新手,需要建议。我有一个带有多个ImageView的GridLayout。每个ImageView都有一个可绘制的背景色。在单击按钮时,我想根据用户的输入设置两件事的动画:1)将整个视图移动到新位置(这一部分很清晰,不会造成问题),2)仅将图像的可绘制部分移动到新单元格,将背景色保留在原始位置。我完全被困在第二项任务上。如何使用动画移动可绘制的内容?谢谢你的帮助。

  • 我正在考虑将我们内部的汽车/测量应用程序从Swing移植到JavaFX,主要是因为它有更好的外观和多点触控支持,但是我找不到一种方法来渲染只有当它们可见时才可以呈现的自定义组件。 为了获得动力,想象一个有10个选项卡的屏幕,每个选项卡内都有一个显示正在测量的一些实时数据的图。任何时候,只能看到一个情节。数据量很大,计算机有足够的能力一次渲染一个情节,但不能同时渲染所有情节。 摇摆版 现在在Swin

  • 在javaFX中,调整画布大小没有这样的方法,唯一的解决方案是从画布扩展。 “从画布扩展”是使画布可调整大小的唯一解决方案吗?因为这个解决方案只有在我们不想使用FXML的情况下才起作用,如果我们在FXML中声明一个画布,我们如何使它可以调整大小? 这是我的代码: