Java: Separating UI from Logic

One of the most important ideas in organizing programs is to separate the user interface (GUI, presentation, view and controller, ...) from the logic (model, engine, ...). There are two really good reasons for this.
  1. The resulting program is conceptually simpler, and this means it is easier to work on, extend, refactor, understand, maintain, etc.
  2. A different user interface or logic model can be added without affecting the other. For example, imagine that we've written a game, eg Connect4, and separated the graphical user interface from the underlying game logic. Why would we want to replace the GUI?