如何检测JavaFX中已完成的调整大小操作?
我有舞台 , 场景和WebView节点。 当我将窗口扩大到更大的尺寸时 - 由于WebView,事情变得非常缓慢。 我只想在窗口大小调整完成时(这是我在窗口的可调整大小的控件/边缘上释放鼠标左键),为WebView填充新的空间。 现在我可以设置最大值。 这个节点的大小与默认情况下的大小有关 - 这会阻止它扩展。 但是,如何在窗口上检测完成的调整大小操作的实际事件? 通过绑定,我可以验证调整大小是否发生 - 但它是即时的(W&D变化立即不释放LMB)的属性,而我只需要在LMB发布时执行操作。 建议?
我尝试在Event.ANY的舞台上使用addEventFilter ,只是为了查看这个事件类型是否可识别 - 可惜没有用。
我也偶然发现了这个没有答案的帖子。
此答案仅适用于您可以为应用程序使用未修饰的舞台。
有了未修饰的舞台,您可以自己处理调整大小的装饰和操作; 允许访问右钩以处理完成调整大小操作。
请参阅Ensemble示例应用程序源代码中的WindowResizeButton类,以获取有关如何为未修饰的舞台实施调整大小手柄的演示。 修改此类以添加setOnMouseReleased处理程序并在其中实现您的webView大小修改。
我想知道为什么这是必要的,因为我没有真正有任何阻碍调整包含WebView的Window的缓慢 - 也许这是由于您的应用程序在WebView中与我一直使用的内容使用不同。
这不是你的问题的直接答案。 如果我正确地理解了这种呆滞,你就会面临一些奇怪的闪光和渲染效果。 为了减少呆滞,可以手动更新webView的大小,并且更加稀疏:
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);
}
}
webView位于不自动布局子项的Pane
中。 webView的大小更新延迟0.5秒,忽略间隔中的更新。
我正在制作一个应用程序,我必须定期获取卫星图像(相当密集),所以我必须找到一种方法来捕获最后一个事件。 我决定在执行密集型任务之前产生一个线程来计数一段时间,并调整重置计数的调整大小侦听器。 对于我来说,比调度和未调度任务好几百倍似乎更有效率。
注意我在这里也有一些逻辑用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
链接地址: http://www.djcxy.com/p/61247.html
上一篇: how can one detect a finished resizing operation in JavaFX?