【问题标题】:Is there are any implementation of rectangle selection in javafx?javafx中是否有矩形选择的实现?
【发布时间】:2014-03-31 13:54:14
【问题描述】:

我的意思是,就像在文件管理器中一样,当您单击、拖动鼠标、创建矩形选择并在鼠标释放后创建选择?

我可以这样做(类似伪代码):

onMousePressed:
setGestureStarted(true)

onMouseMoved:
if isGestureStarted:
   changeRectangle(event.getX, event.getY)

onMouseReleased:
   select(getSelectionRectange())

但我认为这是很常见的行为,也许它已经在框架中了。

编辑1:

我试图做可缩放的折线图。我实际上遇到了图书馆来做到这一点。 这很不错,但可能会更好。 现在我正在考虑 javaFX 在我们的 Web 项目中的实际价值,因为我不喜欢可缩放图表之类的东西不在库中。使用 javascript 可能会更好(除了我应该先学习它,但它不应该那么难)。

【问题讨论】:

标签: javafx selection


【解决方案1】:


您可能需要为此进行自己的实现。我发现你的伪代码很安静。如果您想选择任何组件,那么您需要首先创建一个简单的矩形边界,这很容易通过您的伪代码实现。

现在要找出您的节点是否在该边界内,那么您需要使用此函数对某个父对象的所有节点/子对象进行迭代:Node Intersect check

我建议在 onMouseReleased 之后使用该功能,或者如果您想实时查看事物,则最好在 onMouseMoved

中使用

【讨论】:

    【解决方案2】:

    您的问题是“JavaFX 中是否有任何矩形选择的实现?”

    答案是“是”。

    SceneBuilder 实现拖选功能。

    SceneBuilder 是 open source,如果您对 SceneBuilder 在 JavaFX 中如何实现此行为感兴趣,请查看源代码。


    SceneBuilderKit 是 SceneBuilder 派生的框架,它的来源在我提供的链接中。

    来自SceneBuilder release notes

    JavaFX Scene Builder Kit 是一种 API,它允许将 Scene Builder 面板和功能直接集成到大型应用程序或 Java IDE(例如 NetBeans、IntelliJ 和 Eclipse)的 GUI 中。


    文档在哪里?

    来自发行说明:

    javafx_scenebuilder_kit_javadoc-2_0-ea--.zip 文件,其中包含 JavaFX Scene Builder Kit 的 API javadoc。您可以从http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html下载压缩文件。

    javafx_scenebuilder_kit_samples-2_0-ea--.zip 文件,其中包含 SceneBuilderHello 示例应用程序,该应用程序显示了如何使用 Scene Builder Kit API 的最小 Java 源代码示例。此示例作为 NetBeans 项目提供。可以从http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html下载。


    也许在您调查之后,SceneBuilder 和 SceneBuilderKit 可能不是您想要的。在这种情况下,请编辑您的问题以使其更明确,并可能包括您的矩形选择实现尝试的源代码以及您的要求的更多详细信息(您打算选择什么、显示该功能如何工作的图像等)。

    【讨论】:

    • 我对它如何实现这个功能不感兴趣。如果某些框架/库中已经存在此功能,我很感兴趣。
    • SceneBuilderKit 是一个框架,它的源代码在我提供的链接中。
    • 如果这是一个库,它的文档在哪里?我们似乎不了解对方。
    • 我在这里没有看到任何框架。 JavaFX 是一个框架。这是 JavaFxSceneBuilder 应用程序的一些开源版本和该应用程序的一些内部代码。如果这是一个图书馆,文档在哪里?以及使用示例?
    【解决方案3】:

    是的,在 jfxtras-labs 项目中通过:

    MouseControlUtil.addSelectionRectangleGesture(Parent root, Rectangle rect)
    

    MouseControlUtil.addSelectionRectangleGesture(Parent root, Rectangle rect, EventHandler<MouseEvent> dragHandler, EventHandler<MouseEvent> pressHandler, EventHandler<MouseEvent> releaseHandler)
    

    更多信息:http://jfxtras.org/doc/8.0labs/jfxtras/labs/util/event/MouseControlUtil.html

    请注意,选择行为是非常特定于应用程序的,上面的类只是一个帮助类,可以帮助您实现选择手势。最后你必须自己实现选择行为。

    有关 JavaFx 中节点选择的更详细和成熟的示例,请参阅我的另一个答案 here


    编辑:基本演示

    这是基本用法。请注意,这只是一个演示,不应被视为最终或生产就绪!对于更复杂的选择行为实现,您应该根据应用程序的特定要求自行定制它(主要是鼠标处理程序)。

    import java.util.ArrayList;
    import java.util.List;
    import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.scene.Group;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.Circle;
    import javafx.scene.shape.Rectangle;
    import javafx.scene.shape.Shape;
    import javafx.stage.Stage;
    import jfxtras.labs.util.event.MouseControlUtil;
    
    public class ShapeSelectionExample extends Application {
    
    private List<Shape> selected = new ArrayList<>();
    
    @Override
    public void start(Stage primaryStage) {
    
        final Group shapesGroup = new Group();
        final AnchorPane root = new AnchorPane(shapesGroup);
    
        // Add whatever shapes you like...
        Rectangle shape1 = new Rectangle(200, 20, 50, 50);
        Rectangle shape2 = new Rectangle(300, 60, 50, 50);
        Circle shape3 = new Circle(100, 100, 30);
        shapesGroup.getChildren().addAll(shape1, shape2, shape3);
        
        final Rectangle selectionRect = new Rectangle(10, 10, Color.TRANSPARENT);
        selectionRect.setStroke(Color.BLACK);
        
        EventHandler<MouseEvent> mouseDragHanlder = new EventHandler<MouseEvent>() {
            public void handle(MouseEvent event) {
                for (Node shape : shapesGroup.getChildren()) {
                    handleSelection(selectionRect, (Shape) shape);
                }
            }
        };
        
        // Add selection gesture
        MouseControlUtil.addSelectionRectangleGesture(root, selectionRect, mouseDragHanlder, null, null);
        
        primaryStage.setScene(new Scene(root, 400, 300));
        primaryStage.show();
    }
    
    private void handleSelection(Rectangle selectionRect, Shape shape) {
        if(selectionRect.getBoundsInParent().intersects(shape.getBoundsInParent())) {
            shape.setFill(Color.RED);
            if(!this.selected.contains(shape))
                this.selected.add(shape);
        } else {
            shape.setFill(Color.BLACK);
            this.selected.remove(shape);
        }
        System.out.println("number of selected items:" + this.selected.size());
    }
    
    public static void main(String[] args) {
        launch(args);
    }
    
    }
    

    结果如下所示:

    您还可以编写鼠标按下和释放处理程序(在此代码中当前为 null)来处理按下或释放鼠标按钮时的选择行为(这与鼠标拖动不同)。

    【讨论】:

    • 试过了,但没有按预期工作。黑色矩形出现在与鼠标所在位置无关的位置。您可能想为您的提案提供一个工作示例。
    • 我想使用 api,但这里也一样 - 我没有找到任何代码示例。
    • @WolfgangFahl 我添加了一个示例演示
    • @IARI 这可能是因为选择行为实际上是特定于应用程序的,而上面的类只是一个帮助类。无论如何,我添加了一个示例来帮助您入门。
    • 谢谢。与此同时,我最终得到了stackoverflow.com/questions/55076613/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2023-03-22
    • 2013-12-01
    • 2013-05-24
    相关资源
    最近更新 更多