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

当用户释放鼠标左键时获取单阶段调整大小事件

唐兴思
2023-03-14
stage.titleProperty().bind(
        scene.widthProperty().asString().
        concat(" : ").
        concat(scene.heightProperty().asString()));

共有1个答案

弘涛
2023-03-14

据我所知,调整阶段大小的鼠标事件处理程序是由本地管理的,因此无法纯粹在JavaFX中访问这些处理程序--要按照您所描述的方式来实现这一点,就需要编写本地库并与它们挂钩。

如果您正在进行一些繁重的计算(或其他需要很长时间的工作)以响应阶段大小的更改,那么最好的方法可能是编写一次只处理一个更改的代码,并且在可能的情况下只处理最后一个已知的更改。

这方面的一个例子是:

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class StageResizeThrottling extends Application {

    private Random rng = new Random();

    @Override
    public void start(Stage primaryStage) {

        BlockingQueue<Point2D> dimensionChangeQueue = new ArrayBlockingQueue<>(1);
        ChangeListener<Number> dimensionChangeListener = (obs, oldValue, newValue) -> {
            dimensionChangeQueue.clear();
            dimensionChangeQueue.add(new Point2D(primaryStage.getWidth(), primaryStage.getHeight()));
        };
        primaryStage.widthProperty().addListener(dimensionChangeListener);
        primaryStage.heightProperty().addListener(dimensionChangeListener);

        Thread processDimensionChangeThread = new Thread(() -> {
            try {
                while (true) {
                    System.out.println("Waiting for change in size");
                    Point2D size = dimensionChangeQueue.take();
                    System.out.printf("Detected change in size to [%.1f, %.1f]: processing%n", size.getX(), size.getY());
                    process(size, primaryStage);
                    System.out.println("Done processing");
                }
            } catch (InterruptedException letThreadExit) { }
        });
        processDimensionChangeThread.setDaemon(true);
        processDimensionChangeThread.start();

        Scene scene = new Scene(new StackPane(), 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void process(Point2D stageDimension, Stage stage) throws InterruptedException {
        // simulate slow process:
        Thread.sleep(500 + rng.nextInt(1000));
        final String title = String.format("Width: %.0f Height: %.0f", stageDimension.getX(), stageDimension.getY());
        Platform.runLater(() -> stage.setTitle(title));
    }

    public static void main(String[] args) {
        launch(args);
    }
}
    BlockingQueue<Point2D> dimensionChangeQueue = new ArrayBlockingQueue<>(1);

    PauseTransition coalesceChanges = new PauseTransition(Duration.millis(300));
    coalesceChanges.setOnFinished(e -> {
        dimensionChangeQueue.clear();
        dimensionChangeQueue.add(new Point2D(primaryStage.getWidth(), primaryStage.getHeight()));           
    });

    ChangeListener<Number> dimensionChangeListener = (obs, oldValue, newValue) -> 
        coalesceChanges.playFromStart();

    primaryStage.widthProperty().addListener(dimensionChangeListener);
    primaryStage.heightProperty().addListener(dimensionChangeListener);
 类似资料:
  • 问题内容: 当用户单击JFrame的角以调整大小并在周围拖动鼠标时,随着用户拖动,JFrame将根据鼠标的当前位置进行重新绘制。您如何听这些事件? 以下是我目前尝试的内容: 当用户围绕鼠标拖动时,如何确定和限制用户如何调整窗口大小(基于窗口的当前纵横比)? 问题答案: 您可能需要重写类似的内容(不要忘了调用super)。当然,如果您使用窗口系统配置为拖动轮廓,那仍然可能不起作用。

  • 问题内容: 将矩形放在QGraphicsScene中并使其可以用鼠标移动后,如何用鼠标调整大小? 如果没有人知道答案,那么一个例子也可能很好,我正在使用PyQt4在Python中进行开发。 我知道这里有类似的问题,但它们分别没有回答我。 我的简化代码: 问题答案: 您将需要自己调整大小。要做到这一点,你需要继承和实现鼠标事件处理函数:,,。总体思路如下: 您创建了一组手柄,可用于调整形状的大小。

  • 我对全屏舞台有意见。我有一个主阶段,当应用程序启动时立即进入全屏,然后当用户调用特定事件时,我创建第二阶段,它也是全屏的,但它显示图像,其背景是透明的,所以主阶段及其内容仍然可见。 问题是当我显示这个新的舞台并将其设置为全屏模式时,它会使我的主舞台退出全屏模式并调整大小。 主要舞台的创作: 新阶段的创建:

  • 我正在处理fabric js应用程序&当我们用鼠标调整字体大小时,我需要增加/减少字体大小 我试过的代码 null null 但这只是缩放文本,而不是增加/减少字体大小,但我必须调整字体大小,就像这样

  • 我已经实现了非常简单的鼠标拖动位于中间的选项卡窗格。鼠标大小调整是非常基本的,它的工作不是很好,但现在我可以拖动选项卡的边界并增加大小。 现在我发现了一个问题。当我调整位于中心的标签的大小时,位于中心旁边的组件并没有像用户期望的那样被推回并自动尖叫,它们被放置在我调整大小的组件的后面。当我用鼠标拖动扩展主组件时,我能以某种方式设置所有组件被推回吗?

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