From 7dc7d050cbeba34013dc7e854eeb36b3fd4d7969 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Mon, 19 Sep 2016 18:42:54 +0300 Subject: [PATCH] Javafx: Update the SceneBuilder asynchronously, because it's a quite heavy operation. --- .../sceneBuilder/SceneBuilderEditor.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java index 3b95be9d1a36..e007ea96e84a 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/sceneBuilder/SceneBuilderEditor.java @@ -32,6 +32,7 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.util.*; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; /** @@ -49,10 +50,10 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor private final CardLayout myLayout = new CardLayout(); private final JPanel myPanel = new JPanel(myLayout); - //private final JPanel myErrorPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, 10, 5, true, false)); private final JPanel myErrorPanel = new JPanel(new BorderLayout()); private final HyperlinkLabel myErrorLabel = new HyperlinkLabel(); private JTextArea myErrorStack; + private final AtomicBoolean myIsUpdateStatePending = new AtomicBoolean(); private final Document myDocument; private final ExternalChangeListener myChangeListener; @@ -164,12 +165,18 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor } private void updateState() { - addSceneBuilder(); + if (myIsUpdateStatePending.compareAndSet(false, true)) { + removeSceneBuilder(); // remove immediately to avoid showing old contents for a moment + + ApplicationManager.getApplication().invokeLater(() -> { + if (myIsUpdateStatePending.compareAndSet(true, false)) { + addSceneBuilder(); + } + }); + } } private void addSceneBuilder() { - removeSceneBuilder(); - try { FileDocumentManager.getInstance().saveDocument(myDocument); @@ -188,11 +195,13 @@ public class SceneBuilderEditor extends UserDataHolderBase implements FileEditor private void removeSceneBuilder() { myChangeListener.stop(); - if (mySceneBuilder != null) { - myPanel.remove(mySceneBuilder.getPanel()); - mySceneBuilder.close(); - mySceneBuilder = null; - } + UIUtil.invokeLaterIfNeeded(() -> { + if (mySceneBuilder != null) { + myPanel.remove(mySceneBuilder.getPanel()); + mySceneBuilder.close(); + mySceneBuilder = null; + } + }); } @NotNull