private void updateGUI() {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				List<String> keys = new LinkedList<String>();
				synchronized (swimming) {
					keys.addAll(inst().logs.keySet());
				}
				Collections.sort(keys, new Comparator<String>() {
					public int compare(String a, String b) {
						if (a.length() > b.length()) return 1;
						if (a.length() < b.length()) return -1;
						return a.compareTo(b);
					}
				});
				StringBuffer sb = new StringBuffer();
				int maxk = 0;
				for (String s : keys)
					if (s.length() > maxk)
						maxk = s.length();
				long ctime = System.currentTimeMillis();
				synchronized (swimming) {
					for (String s : keys) {
						double sago = (ctime - stamps.get(s))/1000.0;
						sago = (int)(100 * sago) / 100.0;
						
						if (sb.length() > 0)
							sb.append("\n");
						sb.append("[");
						sb.append(s);
						sb.append("] ");
						for (int i = 0; i < maxk - s.length(); i++)
							sb.append(" ");
						String msg = logs.get(s) + "   (" + sago + "s ago)";
						int mlen =  80 - (maxk+3);
						while (msg.length() > mlen) {
							sb.append(msg.substring(0, mlen).trim());
							msg = msg.substring(mlen).trim();
							sb.append("\n");
							for (int i = 0; i < maxk+3; i++)
								sb.append(" ");
						}
						sb.append(msg);
					}
				}
				logArea.setText(sb.toString());
				
				anyChange = false;
			}
		});
	}