一个人如何可以检测JavaFX的一个完成调整操作?(how can one detect a fin

2019-09-19 05:11发布

我有一个舞台场景的WebView节点。 当我的窗口扩大到更大的尺寸-事情就变得非常低迷,由于网页视图 。 我想要做的就是填补只有当窗口的大小调整已经完成的WebView新的空间(这是我释放窗口的可调整大小的控制/ EDGE鼠标左键)。 现在我可以设置最大。 这个节点是在默认情况下是什么规模 - 这将扩展停止。 但我怎么能检测窗口完成调整操作的实际情况? 用结合,我可以确认的是,调整大小发生-但它的瞬时(用于W&d变化特性立即W / O释放LMB),而我只有LMB已被释放时需要执行一个动作。 建议?


我试着用在舞台Event.ANYaddEventFilter,只是为了看看这个事件类型是可识别的-遗憾的是有没有用。

我也偶然发现了这个悬而未决职位。

Answer 1:

这个答案是唯一的,如果你能使用适用未修饰的舞台为您的应用。

与未修饰的阶段,你可以处理的大小调整的装饰和运营自己; 允许访问右勾拳处理调整大小操作完成。

看到的WindowResizeButton类合奏示例应用程序的源代码,如何实现调整大小手柄未修饰的舞台演示。 修改这个类来添加setOnMouseReleased在那里处理程序,并执行网页视图大小的修改。

我不知道为什么这是必要的,虽然我还没有真正有任何懈怠调整包含的WebView一个窗口 - 也许这是因为从我一直使用的是什么有在不同的网页视图内容使用你的应用程序。



Answer 2:

这是不是直接回答你的问题。 如果我理解正确呆滞你面对somekind的怪异泛水和渲染。 为了减少呆滞web视图的尺寸可以手动地和更稀疏地进行更新:

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.PaneBuilder;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javafx.util.Duration;

public class KSO_Demo extends Application {

    @Override
    public void start(Stage primaryStage) {

        final WebView webView = new WebView();
        webView.getEngine().loadContent("<div style='background-color: gray; height: 100%'>Some content</div>");

        final Pane pane = PaneBuilder.create().children(webView).style("-fx-border-color: blue").build();

        final Timeline animation = new Timeline(
                new KeyFrame(Duration.seconds(.5),
                new EventHandler<ActionEvent>() {

                    @Override
                    public void handle(ActionEvent actionEvent) {
                        webView.setPrefSize(pane.getWidth(), pane.getHeight());
                    }
                }));
        animation.setCycleCount(1);

        primaryStage.setScene(new Scene(pane, 300, 250));

        primaryStage.widthProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
                animation.play();
            }
        });

        primaryStage.heightProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
                animation.play();
            }
        });
        primaryStage.show();
    }

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

web视图在Pane不自动布局其孩子。 web视图的大小更新延迟为0.5英寸间隔第二忽略更新。



Answer 3:

我在做应用的时候,必须定期获取卫星图像(相当密集的),所以我必须找到一种方式来捕捉只有最后一个事件也是如此。 我定居在产生线程执行密集型任务和resize监听重置计数前倒数了一定长度的时间。 这似乎更有效的对我比调度和unscheduling任务数百次。

请注意,我还得到了在这里一些逻辑来捕捉先用System.currentTimeMillis的窗口大小的变化();

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;

public class ResizeListener implements ChangeListener {
    long lastdragtime = System.currentTimeMillis();
    double xi, yi, dx, dy, wid, hei;
    GuiModel model;
    TimerThread timebomb;

    public ResizeListener(GuiModel model) {
        this.model = model;
        timebomb = new TimerThread(350);
        timebomb.start();
    }

    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
        if (System.currentTimeMillis() - lastdragtime > 350) { //new drag
            xi = model.stage.getWidth();
            yi = model.stage.getHeight();
            model.snapshot = model.canvas.snapshot(null, null);
        }

        timebomb.active = true;//start timer
        timebomb.ms = timebomb.starttime;//reset timer

        wid = model.stage.getWidth()-72;
        hei = model.stage.getHeight()-98;
        dx = model.stage.getWidth() - xi;
        dy = model.stage.getHeight() - yi;
        if (dx < 0 && dy < 0) {
            model.canvas.setWidth(wid);
            model.canvas.setHeight(hei);
            model.graphics.drawImage(model.snapshot, -dx/2, -dy/2, wid, hei, 0, 0, wid, hei);
        } else if (dx < 0 && dy >= 0) {
            model.canvas.setWidth(wid);
            model.graphics.drawImage(model.snapshot, -dx/2, 0, wid, hei, 0, 0, wid, hei);
        } else if (dx >= 0 && dy < 0) {
            model.canvas.setHeight(hei);
            model.graphics.drawImage(model.snapshot, 0, -dy/2, wid, hei, 0, 0, wid, hei);
        }
        lastdragtime = System.currentTimeMillis();
    }

    private class TimerThread extends Thread {
        public final int starttime;//multiple of 25
        public int ms = 0;
        public boolean active = false;

        public TimerThread(int starttime) {
            this.setDaemon(true);
            this.starttime = starttime;
        }

        public void run() {
            while (true) {
                try {
                    Thread.sleep(25);
                } catch (InterruptedException x) {
                    break;
                }

                if (active) {
                    ms -= 25;
                    if (ms <= 0) {
                        active = false;
                        Platform.runLater(() -> {
                            model.canvas.setWidth(wid);
                            model.canvas.setHeight(hei);
                            model.fetchSatelliteImagery();
                            model.refresh();
                        });
                    }
                }
            }
        }
    }//end TimerThread class
}//end listener class


文章来源: how can one detect a finished resizing operation in JavaFX?