Javafx: Update the SceneBuilder asynchronously, because it's a quite heavy operation.

This commit is contained in:
Pavel Dolgov
2016-09-20 14:19:06 +03:00
parent 2d772e7448
commit 7dc7d050cb
@@ -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