From 89f7f2370cac3e689ceabb70cb374b3a4e192cc1 Mon Sep 17 00:00:00 2001 From: mdb Date: Wed, 2 Apr 2003 04:04:53 +0000 Subject: [PATCH] Fixed a problem with "smart" sizing of multiline labels. User interfaces are complicated things. git-svn-id: https://samskivert.googlecode.com/svn/trunk@1089 6335cc39-0255-0410-8fd6-9bcaacd3b74c --- .../com/samskivert/swing/MultiLineLabel.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java b/projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java index 17028172..252995df 100644 --- a/projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java +++ b/projects/samskivert/src/java/com/samskivert/swing/MultiLineLabel.java @@ -1,5 +1,5 @@ // -// $Id: MultiLineLabel.java,v 1.10 2003/01/15 00:17:23 mdb Exp $ +// $Id: MultiLineLabel.java,v 1.11 2003/04/02 04:04:53 mdb Exp $ // // samskivert library - useful routines for java programs // Copyright (C) 2002 Walter Korman @@ -28,6 +28,7 @@ import java.awt.RenderingHints; import javax.swing.JComponent; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import com.samskivert.Log; import com.samskivert.util.StringUtil; @@ -253,6 +254,7 @@ public class MultiLineLabel extends JComponent // if we have been configured to relay ourselves out once we know // our constrained width or height, take care of that here int size; + boolean delayedRevalidate = false; switch (_constrain) { case HORIZONTAL: size = getWidth(); @@ -261,7 +263,7 @@ public class MultiLineLabel extends JComponent if (size > 0 && size != _constrainedSize) { _constrainedSize = size; _label.setTargetWidth(size); - revalidate(); + delayedRevalidate = true; } break; @@ -270,11 +272,30 @@ public class MultiLineLabel extends JComponent if (size > 0 && size != _constrainedSize) { _constrainedSize = size; _label.setTargetHeight(size); - revalidate(); + delayedRevalidate = true; } break; } + // we can't just call revalidate() because we're in the middle of + // a validation traversal; our parent will, when we return from + // this method, declare itself to be valid; if we call + // revalidate() it will mark us and all of our parents as invalid, + // but then those of our parents that are involved in the first + // validation traversal will mark themselves as valid and in the + // validation pass that results from our call to revalidate() we + // will be skipped over; dooh! instead we delay a call to + // revalidate so that the current validation traversal will be + // completed before we mark ourselves and our parents as invalid + if (delayedRevalidate) { + Runnable callRevalidate = new Runnable() { + public void run() { + revalidate(); + } + }; + SwingUtilities.invokeLater(callRevalidate); + } + // go ahead and lay out the label in all cases so that we assume // some sort of size layoutLabel();