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

在Javafx中单击内部时,不应最小化透明阶段

石博艺
2023-03-14

我正在学习用JavaFx创建屏幕录制应用程序。我希望用户调整矩形的大小,以决定屏幕捕捉区域。我通过primaryStage使舞台和场景透明。initStyle(StageStyle.TRANSPARENT) 和<代码>场景。设置填充(null) 。我可以调整矩形部分的大小,但问题是当我在舞台内部单击时,它会最小化,因为它是透明的。如何解决这个问题?我看过这个应用程序screencast-o-matics,并遵循同样的原则。请在这方面指导我。

编辑:: 代码:

    import java.awt.Toolkit;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class ScreenCaptureDemo extends Application {

    Rectangle rectangle ;
    double x0,y0;

    public static void main(String[] args) {
        launch(ScreenCaptureDemo.class);
    }

    @Override
    public void start(final Stage primaryStage) throws Exception {

        BorderPane borderPane = new BorderPane();

        GridPane gridPane = new GridPane();

        HBox box = new HBox();
        Button button1 = new Button("button2");
        Button button2 = new Button("Button3");
        Button button = new Button("button");

        box.getChildren().add(button);
        box.getChildren().add(button1);
        box.getChildren().add(button2);



        rectangle = new Rectangle(500.0, 500.0);

        rectangle.setStrokeWidth(2);
        rectangle.setArcHeight(15.0);
        rectangle.setArcWidth(15.0);
        rectangle.setFill(Color.TRANSPARENT);
        rectangle.setStroke(Color.RED);
        rectangle.setStrokeWidth(5);
        rectangle.getStrokeDashArray().addAll(3.0,13.0,3.0,7.0);

        gridPane.add(rectangle, 0, 0);
        gridPane.add(box, 0, 1);

        borderPane.setCenter(gridPane);

        Scene scene = new Scene(borderPane,Toolkit.getDefaultToolkit().getScreenSize().getWidth()-100,Toolkit.getDefaultToolkit().getScreenSize().getHeight()-100);
        scene.setOnMouseDragged(mouseHandler);
        scene.setOnMousePressed(mouseHandler);

        primaryStage.setScene(scene);
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        scene.setFill(null);
        rectangle.setMouseTransparent(true);
        rectangle.setPickOnBounds(true);
        primaryStage.show();

    }


    void setScaleRect(double sX, double sY){
        rectangle.setHeight(sY);
        rectangle.setWidth(sX);
    }

    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent mouseEvent) {

            if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                double heightLowerLimit = rectangle.getHeight()-500;
                double heightUpperLimit = rectangle.getHeight()+500;
                double widthLowerLimit = rectangle.getWidth()-500;
                double widthUpperLimit = rectangle.getWidth()+500;
                if ((mouseEvent.getY() >heightLowerLimit && mouseEvent.getY() < heightUpperLimit) && 
                        (mouseEvent.getX() >widthLowerLimit && mouseEvent.getX() < widthUpperLimit)
                        ) {

                    double scaleX = mouseEvent.getX();
                    double scaleY = mouseEvent.getY();

                    setScaleRect(scaleX, scaleY);
                } else if ((mouseEvent.getY() >heightLowerLimit && mouseEvent.getY() < heightUpperLimit)
                        && (mouseEvent.getX() <widthLowerLimit && mouseEvent.getX() > widthUpperLimit)) {
                    double scaleY = mouseEvent.getY();
                    double scaleX=rectangle.getWidth();
                    setScaleRect(scaleX, scaleY);
                } else if (mouseEvent.getY() != rectangle.getHeight()
                        && mouseEvent.getX() == rectangle.getWidth()) {
                    double scaleX = mouseEvent.getX();
                    double scaleY=rectangle.getHeight();
                    setScaleRect(scaleX, scaleY);
                }

            }

        }

    };
}

提前谢谢你

共有1个答案

马琛
2023-03-14

将矩形填充为

rectangle.setFill(Color.web("blue", 0.1));
// or more transparent
rectangle.setFill(Color.web("gray", 0.01));
 类似资料:
  • 我在JavaFX应用程序中有一个未修饰的阶段。为了最小化它,我需要一个最小化按钮。我在中创建了我的布局,其中有一个,但是当我尝试使用最小化位于控制器内部的这个按钮时,使用,它找不到阶段。 如何在控制器类中找到对该阶段的引用?

  • 我有一个未装饰的JavaFX舞台,我自己的最小化,最大化 有没有办法通过单击任务栏图标来最小化纯Java代码未修饰的阶段?如果不是的话,我该怎么做,比如说,JNA? 编辑:好的,我一直在尝试用JNA解决这个问题,但由于几乎没有C/C/JNA,我在设置这个方面有点麻烦。如果有人帮我把这些东西拼凑起来,我将不胜感激。。 到目前为止,这是我的代码: 编辑2:我最终在这一点上做得更进一步,但当我重新设置W

  • 问题内容: 我有一个未经修饰的JavaFX Stage,还有我自己的最小化,最大化和关闭按钮。但不幸的是,与经过修饰的行为相比,在Windows 7中单击任务栏图标不会自动最小化该阶段。 通过单击任务栏图标,是否可以通过纯Java代码最小化未修饰的阶段?如果不是,我该如何使用JNA? 编辑: 好的,我一直在尝试使用JNA解决此问题,但是几乎没有C / C ++ / JNA完成,因此设置起来有些麻烦

  • 将其添加到任何JavaFX应用程序的primaryStage: 最小化阶段。输出为“图标化:true” 恢复舞台。输出为“图标化:假” 将舞台最大化,然后将其最小化。输出为“图标化:true” 现在再次恢复舞台。输出应该是“图标化:false”,但它不会打印任何内容 因此,在去锥化最大化阶段时,不会调用我的图标化属性侦听器。我做错了吗,还是这是JavaFX中的一个bug?我使用的是Java 1.8

  • 我在这个问题上使用了公认的答案:JavaFX最小化未装饰阶段,以适当地最小化我的应用程序。 然而,不幸的是,默认窗口最小化了 我知道可以在未装饰的窗口中显示动画,因为我有一个应用程序具有这种行为(PotPlayer)。 如何使用JNA制作动画? 编辑:这是一个可以正常最小化JavaFX窗口的Kotlin代码段,还添加了bounty。

  • 问题内容: 我正在尝试在Java应用程序中显示动画gif。到目前为止,它可以 显示和设置动画,但是在应该是全黑或 全白的情况下,它似乎变得透明了,我可以看到 下面绘制的矩形的颜色。例如,这是我正在使用的gif之一: 真正奇怪的是,它似乎在 第一帧中正确显示,然后才混乱。这是我 用来获取和绘制图像的方法: 我在扩展JPanel的类中重写paintcomponent,并且只 对该类调用一次repain