Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableCellRenderer.java	(revision 9223)
@@ -11,4 +11,5 @@
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 
 /**
@@ -43,5 +44,5 @@
     }
 
-    protected void renderBackground(MemberTableModel model, OsmPrimitive primitive, boolean isSelected) {
+    protected void renderBackgroundForeground(MemberTableModel model, OsmPrimitive primitive, boolean isSelected) {
         Color bgc = UIManager.getColor("Table.background");
         if (isSelected) {
@@ -52,15 +53,5 @@
             bgc = BGCOLOR_DOUBLE_ENTRY;
         }
-        setBackground(bgc);
-    }
-
-    protected void renderForeground(boolean isSelected) {
-        Color fgc;
-        if (isSelected) {
-            fgc = UIManager.getColor("Table.selectionForeground");
-        } else {
-            fgc = UIManager.getColor("Table.foreground");
-        }
-        setForeground(fgc);
+        GuiHelper.setBackgroundReadable(this, bgc);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java	(revision 9223)
@@ -33,7 +33,6 @@
 
         this.value = (WayConnectionType) value;
-        renderForeground(isSelected);
         setToolTipText(((WayConnectionType) value).getToolTip());
-        renderBackground(getModel(table), null, isSelected);
+        renderBackgroundForeground(getModel(table), null, isSelected);
         return this;
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java	(revision 9223)
@@ -40,7 +40,6 @@
         Rectangle cellSize = table.getCellRect(row, column, false);
 
-        renderForeground(isSelected);
         OsmPrimitive primitive = (OsmPrimitive) value;
-        renderBackground(getModel(table), primitive, isSelected);
+        renderBackgroundForeground(getModel(table), primitive, isSelected);
         renderPrimitive(primitive, cellSize);
         return this;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRenderer.java	(revision 9223)
@@ -15,7 +15,6 @@
             return this;
 
-        renderForeground(isSelected);
         String role = (String) value;
-        renderBackground(getModel(table), null, isSelected);
+        renderBackgroundForeground(getModel(table), null, isSelected);
         setText(role);
         return this;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java	(revision 9223)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -56,5 +57,5 @@
             bgc = BGCOLOR_DOUBLE_ENTRY;
         }
-        setBackground(bgc);
+        GuiHelper.setBackgroundReadable(this, bgc);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 9223)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -209,5 +210,5 @@
             gc.weightx = 1.0;
             add(lblLat = new JLabel(), gc);
-            lblLat.setBackground(Color.WHITE);
+            GuiHelper.setBackgroundReadable(lblLat, Color.WHITE);
             lblLat.setOpaque(true);
             lblLat.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
@@ -227,5 +228,5 @@
             gc.weightx = 1.0;
             add(lblLon = new JLabel(), gc);
-            lblLon.setBackground(Color.WHITE);
+            GuiHelper.setBackgroundReadable(lblLon, Color.WHITE);
             lblLon.setOpaque(true);
             lblLon.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
@@ -275,13 +276,13 @@
             if (coord == oppositeCoord ||
                     (coord != null && oppositeCoord != null && coord.lat() == oppositeCoord.lat())) {
-                lblLat.setBackground(Color.WHITE);
+                GuiHelper.setBackgroundReadable(lblLat, Color.WHITE);
             } else {
-                lblLat.setBackground(BGCOLOR_DIFFERENCE);
+                GuiHelper.setBackgroundReadable(lblLat, BGCOLOR_DIFFERENCE);
             }
             if (coord == oppositeCoord ||
                     (coord != null && oppositeCoord != null && coord.lon() == oppositeCoord.lon())) {
-                lblLon.setBackground(Color.WHITE);
+                GuiHelper.setBackgroundReadable(lblLon, Color.WHITE);
             } else {
-                lblLon.setBackground(BGCOLOR_DIFFERENCE);
+                GuiHelper.setBackgroundReadable(lblLon, BGCOLOR_DIFFERENCE);
             }
         }
@@ -322,5 +323,5 @@
             gc.weightx = 1.0;
             add(lblDistance = new JLabel(), gc);
-            lblDistance.setBackground(Color.WHITE);
+            GuiHelper.setBackgroundReadable(lblDistance, Color.WHITE);
             lblDistance.setOpaque(true);
             lblDistance.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
@@ -335,12 +336,8 @@
             if (coord != null && oppositeCoord != null) {
                 double distance = coord.greatCircleDistance(oppositeCoord);
-                if (distance > 0) {
-                    lblDistance.setBackground(BGCOLOR_DIFFERENCE);
-                } else {
-                    lblDistance.setBackground(Color.WHITE);
-                }
+                GuiHelper.setBackgroundReadable(lblDistance, distance > 0 ? BGCOLOR_DIFFERENCE : Color.WHITE);
                 lblDistance.setText(NavigatableComponent.getDistText(distance));
             } else {
-                lblDistance.setBackground(coord != oppositeCoord ? BGCOLOR_DIFFERENCE : Color.WHITE);
+                GuiHelper.setBackgroundReadable(lblDistance, coord != oppositeCoord ? BGCOLOR_DIFFERENCE : Color.WHITE);
                 lblDistance.setText(tr("(none)"));
             }
Index: trunk/src/org/openstreetmap/josm/gui/history/NodeListTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/NodeListTableCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/history/NodeListTableCellRenderer.java	(revision 9223)
@@ -13,4 +13,5 @@
 
 import org.openstreetmap.josm.gui.history.TwoColumnDiff.Item.DiffItemType;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -46,5 +47,5 @@
         }
         setText(text);
-        setBackground(bgColor);
+        GuiHelper.setBackgroundReadable(this, bgColor);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java	(revision 9223)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.gui.history.TwoColumnDiff.Item;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -58,5 +59,5 @@
         setText(text);
         setToolTipText(text);
-        setBackground(bgColor);
+        GuiHelper.setBackgroundReadable(this, bgColor);
     }
 
@@ -75,5 +76,5 @@
         setText(text);
         setToolTipText(text);
-        setBackground(bgColor);
+        GuiHelper.setBackgroundReadable(this, bgColor);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java	(revision 9223)
@@ -9,4 +9,6 @@
 import javax.swing.UIManager;
 import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.gui.util.GuiHelper;
 
 /**
@@ -24,5 +26,5 @@
     }
 
-    protected void setBackground(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected) {
+    protected void setBackgroundReadable(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected) {
         Color bgColor = UIManager.getColor("Table.background");
         if (!model.hasTag(key) && model.isCurrentPointInTime()
@@ -39,5 +41,5 @@
         }
 
-        setBackground(bgColor);
+        GuiHelper.setBackgroundReadable(this, bgColor);
     }
 
@@ -57,5 +59,5 @@
             setText(model.hasTag(key) ? key : "");
             setToolTipText(getText());
-            setBackground(key, model, isSelected);
+            setBackgroundReadable(key, model, isSelected);
             break;
         case 1:
@@ -63,5 +65,5 @@
             setText(model.hasTag(key) ? model.getValue(key) : "");
             setToolTipText(getText());
-            setBackground(key, model, isSelected);
+            setBackgroundReadable(key, model, isSelected);
             break;
         }
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 9223)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.io.XmlWriter;
@@ -64,5 +65,5 @@
         setShowGrid(false);
         setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-        setBackground(UIManager.getColor("Button.background"));
+        GuiHelper.setBackgroundReadable(this, UIManager.getColor("Button.background"));
         setIntercellSpacing(new Dimension(6, 0));
         putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 9223)
@@ -47,4 +47,5 @@
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
@@ -230,8 +231,5 @@
                     Color c = (Color) o;
                     JLabel l = new JLabel(ColorHelper.color2html(c));
-                    l.setBackground(c);
-                    // http://stackoverflow.com/a/3943023/2257172
-                    l.setForeground((c.getRed()*0.299 + c.getGreen()*0.587 + c.getBlue()*0.114) > 186 ?
-                            Color.BLACK : Color.WHITE);
+                    GuiHelper.setBackgroundReadable(l, c);
                     l.setOpaque(true);
                     return l;
Index: trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 9223)
@@ -5,4 +5,5 @@
 
 import java.awt.BasicStroke;
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Container;
@@ -43,4 +44,5 @@
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageOverlay;
@@ -367,3 +369,14 @@
         }
     }
+
+    /**
+     * Sets the background color for this component, and adjust the foreground color so the text remains readable.
+     * @param c component
+     * @param background background color
+     * @since 9223
+     */
+    public static void setBackgroundReadable(JComponent c, Color background) {
+        c.setBackground(background);
+        c.setForeground(ColorHelper.getForegroundColor(background));
+    }
 }
Index: trunk/src/org/openstreetmap/josm/tools/ColorHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ColorHelper.java	(revision 9222)
+++ trunk/src/org/openstreetmap/josm/tools/ColorHelper.java	(revision 9223)
@@ -72,3 +72,16 @@
         return code;
     }
+
+    /**
+     * Determines the correct foreground color (black or white) to use for the given background,
+     * so the text will be readable.
+     * @param bg background color
+     * @return {@code Color#BLACK} or {@code Color#WHITE}
+     * @since 9223
+     */
+    public static Color getForegroundColor(Color bg) {
+        // http://stackoverflow.com/a/3943023/2257172
+        return (bg.getRed()*0.299 + bg.getGreen()*0.587 + bg.getBlue()*0.114) > 186 ?
+                Color.BLACK : Color.WHITE;
+    }
 }
