如何使叠加Vbox节点可点击?

时间:2018-09-04 15:57:59

标签: java javafx lambda

我正在尝试构建一个javafx修剪器,但是,当我在ImageViews上添加setOnMouseClicked时,我制作的修剪器隐藏了这些节点,因此未处理该操作。

我已经设置了Rectangle -50以便将修整器覆盖到ImageView,不幸的是,此make事件无法正常工作。

df.loc[df.Value.groupby((~df.ID.isin([3,5])).sort_values().cumsum()).idxmax()].sort_index()
Out[167]: 
   ID  Value
0   1    100
1   2    250
3   4    400
4   5    600
5   7    800

流动控制器建立在框架上

enter image description here

Rectangle rectangle = new Rectangle(0, -50, 80, 40);

2 个答案:

答案 0 :(得分:1)

请尝试在窗格内添加Hbox和矩形,这样窗格必须为空。希望对您有所帮助:)

    Rectangle rectangle = new Rectangle(0, 0, imgWidth, imgHeight);
    rectangle.setFill(Color.rgb(33, 150, 243, 0.35));
    Pane pane = new Pane();
    VBox vbox = new VBox(); 
    vbox.getChildren().addAll(pane);
    pane.getChildren().addAll(hbox,rectangle);

答案 1 :(得分:1)

鼠标事件转到不是鼠标透明的最顶层节点。只需将属性设置为true,鼠标事件将在通常的节点处处理。另外一件可以使您的生活更轻松的事情是,您还可以将节点放置在不受父级布局算法影响且不影响尺寸计算的布局内。只需将managed设置为false。这使您可以像这样实现选择:

private Node selectedNode;

@Override
public void start(Stage primaryStage) throws Exception {
    HBox container = new HBox();

    File directory = new File("someDirectory");

    Rectangle selection = new Rectangle(80, 40, Color.rgb(100, 100, 255, 0.5));
    selection.setStrokeType(StrokeType.INSIDE);
    selection.setStrokeWidth(4);
    selection.setStroke(Color.WHITE);
    selection.setVisible(false);
    selection.setMouseTransparent(true);
    selection.setManaged(false);

    for (File file : directory.listFiles(f -> f.getName().endsWith(".jpg"))) {
        Image image = new Image(file.toURI().toURL().toExternalForm(), 80, 40, false, false);
        ImageView imageView = new ImageView(image);
        container.getChildren().add(imageView);
        imageView.setOnMouseClicked(evt -> {
            if (selectedNode == imageView) {
                selection.setVisible(false);
                selectedNode = null;
            } else {
                selection.setVisible(true);
                selection.setLayoutX(imageView.getLayoutX());
                selectedNode = imageView;
            }
        });
    }

    container.getChildren().add(selection);

    Scene scene = new Scene(new ScrollPane(container), 400, 400);

    primaryStage.setScene(scene);
    primaryStage.show();
}

注意:我也删除了getResource的使用,这是有充分理由的。资源不保证可以作为文件使用。例如。如果您使用.jar文件,则将无法通过File访问它们。可以将类资源存储在目录中,也可以将资源列表用作文本资源,以使您无需对每个资源都进行硬编码就可以使用多个资源。 (在后一种方法中,请勿使用File。)