Java 如何使覆盖Vbox节点可单击?

Java 如何使覆盖Vbox节点可单击?,java,javafx,lambda,Java,Javafx,Lambda,我正在尝试构建一个javafx微调器,我已经完成了,但是当我在ImageViews上添加了一个setOnMouseClicked时,我制作的微调器隐藏了这些节点,因此操作没有被处理 我已经设置了矩形-50以便将修剪器覆盖到ImageView,不幸的是,这使事件无法工作 Rectangle rectangle = new Rectangle(0, -50, 80, 40); 流动控制器构建的是框架 package-app.controller; 导入java.io.File; 导入java.n

我正在尝试构建一个javafx微调器,我已经完成了,但是当我在ImageViews上添加了一个setOnMouseClicked时,我制作的微调器隐藏了这些节点,因此操作没有被处理

我已经设置了矩形-50以便将修剪器覆盖到ImageView,不幸的是,这使事件无法工作

Rectangle rectangle = new Rectangle(0, -50, 80, 40);
流动控制器构建的是框架

package-app.controller;
导入java.io.File;
导入java.net.URL;
导入java.util.ResourceBundle;
导入javafx.scene.Node;
导入javafx.scene.control.Label;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.effect.DropShadow;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
公共类Trimmer2实现了可初始化{
私有节点selectedNode;
@FXML
私有HBox-hboxStream;
@FXML
私人HBox hboxStreamTrim;
@FXML
私有标签时间;
公共void初始化(URL arg0,ResourceBundle arg1){
buidTrimmer();
}
私有void buildtrimmer(){
ImageView pic=null;
HBox HBox=新的HBox();
DropShadow=新的DropShadow();
ClassLoader ClassLoader=getClass().getClassLoader();
文件路径=新文件(classLoader.getResource(“streams/sub_stream”).getPath());
File[]files=path.listFiles();
Image[]images=新图像[files.length];
ImageView[]pics=新的ImageView[files.length];
对于(int i=0;i{
System.out.println(“执行操作”);
});
hbox.getChildren().add(pics[i]);
}
矩形=新矩形(0,-50,80,40);
矩形.setFill(Color.rgb(331502430.5));
窗格=新窗格(矩形);
使可选择(矩形、窗格);
VBox VBox=新的VBox();
vbox.setspace(10);
vbox.getChildren().addAll(hbox,窗格);
ScrollPane ScrollPane=新的ScrollPane();
scrollPane.setContent(vbox);
setId(“我的滚动窗格”);
hboxStream.getChildren().add(滚动窗格);
}
私有void make可选(节点、窗格根){
node.setOnMouseClicked(事件->{
如果(selectedNode!=节点){
root.getChildren().removeIf(候选->候选实例调整大小控件);
selectedNode=node;
node.toFront();
ResizingControl ResizingControl=新的ResizingControl(节点);
root.getChildren().add(调整大小控制);
}
System.out.println(“此处”);
event.consume();
});
}
}

尝试在窗格中添加Hbox和矩形,顺便说一句,该窗格必须为空。希望有帮助:)


尝试在窗格中添加Hbox和矩形,顺便说一下,该窗格必须为空。希望有帮助:)


鼠标事件转到鼠标不透明的最顶部节点。只需将属性设置为
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
文件,您将无法通过
文件
访问它们。可以将类路径之外的资源存储在目录中,也可以将资源列表作为文本资源使用,这样就可以使用多个资源,而无需对每个资源进行硬编码。(不要将
文件
用于后一种方法。)

鼠标事件转到鼠标不透明的最顶端节点。只需将属性设置为
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
文件,您将无法通过
文件
访问它们。可以将类路径之外的资源存储在目录中,也可以将资源列表作为文本资源使用,这样就可以使用多个资源,而无需对每个资源进行硬编码。(不要将
文件
用于后一种方法。)

您是否只想在HBox中选择一个图像视图?是不是更好的方法(当然是水平方向)?是的,我只想在hbox中选择单击的imageView,我认为这是Vbox覆盖的问题,因为当我删除rect Tirmer SetonMouseClicated works时,您是否只是在hbox中选择imageView?是不是更好的方法(当然是水平方向)?是的,我只想在hbo中选择单击的imageView
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();
}