#35 wip
[fanfix.git] / src / jexer / backend / SwingComponent.java
index 4b0b2b4d079bc2f8b9d43bbc7ad10ab268852438..23b50ab3b7b9f5e157cdb81ff867aa98ee44e070 100644 (file)
@@ -3,7 +3,7 @@
  *
  * The MIT License (MIT)
  *
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -45,6 +45,7 @@ import java.awt.image.BufferedImage;
 import java.awt.image.BufferStrategy;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
 
 /**
  * Wrapper for integrating with Swing, because JFrame and JComponent have
@@ -71,6 +72,17 @@ class SwingComponent {
      */
     private JComponent component;
 
+    /**
+     * An optional border in pixels to add.
+     */
+    private static final int BORDER = 1;
+
+    /**
+     * Adjustable Insets for this component.  This has the effect of adding a
+     * black border around the drawing area.
+     */
+    Insets adjustInsets = new Insets(BORDER + 5, BORDER, BORDER, BORDER);
+
     // ------------------------------------------------------------------------
     // Constructors -----------------------------------------------------------
     // ------------------------------------------------------------------------
@@ -237,11 +249,17 @@ class SwingComponent {
      * @return the value of the insets property
      */
     public Insets getInsets() {
+        Insets swingInsets = null;
         if (frame != null) {
-            return frame.getInsets();
+            swingInsets = frame.getInsets();
         } else {
-            return component.getInsets();
+            swingInsets = component.getInsets();
         }
+        Insets result = new Insets(swingInsets.top + adjustInsets.top,
+            swingInsets.left + adjustInsets.left,
+            swingInsets.bottom + adjustInsets.bottom,
+            swingInsets.right + adjustInsets.right);
+        return result;
     }
 
     /**
@@ -346,17 +364,38 @@ class SwingComponent {
      * @param height the new height in pixels
      */
     public void setDimensions(final int width, final int height) {
-        // Figure out the thickness of borders and use that to set the final
-        // size.
-        Insets insets = getInsets();
-
-        if (frame != null) {
-            frame.setSize(width + insets.left + insets.right,
-                height + insets.top + insets.bottom);
-        } else {
-            component.setSize(width + insets.left + insets.right,
-                height + insets.top + insets.bottom);
+        if (SwingUtilities.isEventDispatchThread()) {
+            // We are in the Swing thread and can safely set the size.
+
+            // Figure out the thickness of borders and use that to set the
+            // final size.
+            if (frame != null) {
+                Insets insets = getInsets();
+                frame.setSize(width + insets.left + insets.right,
+                    height + insets.top + insets.bottom);
+            } else {
+                Insets insets = getInsets();
+                component.setSize(width + insets.left + insets.right,
+                    height + insets.top + insets.bottom);
+            }
+            return;
         }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                // Figure out the thickness of borders and use that to set
+                // the final size.
+                if (frame != null) {
+                    Insets insets = getInsets();
+                    frame.setSize(width + insets.left + insets.right,
+                        height + insets.top + insets.bottom);
+                } else {
+                    Insets insets = getInsets();
+                    component.setSize(width + insets.left + insets.right,
+                        height + insets.top + insets.bottom);
+                }
+            }
+        });
     }
 
     /**