The problem is you're not giving the event dispatch
thread time
to redraw the errorMessage component, since it is busy running
solver.Solve(). When solver.Solve() completes it can redraw it,
but by then it has been set to "No errors" or "Cannot solve".
It should show up if you postpone when the event dispatch thread
calls solver.Solve() by using SwingUtilities.invokeLater(), like
this:
Better would be not to have the event dispatch thread call
solver.Solve(). Run it on a new thread instead, unless it
is doing something that should only be done by the event
dispatch thread.