Question

Is there a list somewhere of the UIManager.getColor() keys for Swing? I can't seem to find it online, just occasional references to strings like "Panel.background" and "Table.selectionBackground".

Was it helpful?

Solution

I was looking for the same thing and found this page as well as an excellent overview of all these properties on http://nadeausoftware.com/node/85.

OTHER TIPS

I don't think there is a defined standard set of keys. But you could try this bit of code to list the ones currently available in alphabetical order:

List<String> colors = new ArrayList<String>();
for (Map.Entry<Object, Object> entry : UIManager.getDefaults().entrySet()) {
    if (entry.getValue() instanceof Color) {
        colors.add((String) entry.getKey()); // all the keys are strings
    }
}
Collections.sort(colors);
for (String name : colors)
    System.out.println(name);

This produces a list too long to reproduce here.

@mmyers got me inspired. Here's a short program to list the UIManager defaults in a sortable table.

package com.example.test.gui;

import java.awt.Color;
import java.awt.Component;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.AbstractTableComparatorChooser;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;

public class UIManagerDefaultsViewer {

    public static class UIEntry
    {
        final private String key;
        final private Object value;

        UIEntry(Map.Entry<Object,Object> e)
        {
            this.key = e.getKey().toString();
            this.value = e.getValue(); 
        }

        public String getKey() {
            return key;
        }
        public Object getValue() {
            return value;
        }
        public Class getValueClass() {
            if (value == null)
                return null; // ?!?!?!
            return value.getClass();
        }
        public String getClassName() {
            // doesn't handle arrays properly
            if (value == null)
                return "";

            return value.getClass().getName();
        }
    }   

    public static class UIEntryRenderer extends DefaultTableCellRenderer
    {
        Color[] defaults = new Color[4];
        public UIEntryRenderer()
        {
            super();
            defaults[0] = UIManager.getColor("Table.background");
            defaults[1] = UIManager.getColor("Table.selectionBackground");
            defaults[2] = UIManager.getColor("Table.foreground");
            defaults[3] = UIManager.getColor("Table.selectionForeground");
        }

        public void setDefaultColors(Component cell, boolean isSelected)
        {
            cell.setBackground(defaults[isSelected ? 1 : 0]);
            cell.setForeground(defaults[isSelected ? 3 : 2]);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column)
        {
            Component cell = super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
            if (table.convertColumnIndexToModel(column) == 1) // the value column
            {
                final EventTableModel<UIEntry> tableModel = 
                    (EventTableModel<UIEntry>) table.getModel();
                UIEntry e = tableModel.getElementAt(row);
                JLabel l = (JLabel)cell;


                if (value instanceof Color)
                {
                    Color c = (Color)value;
                    cell.setBackground(c);
                    cell.setForeground(
                            c.getRed()+c.getGreen()+c.getBlue() >= 128*3
                            ? Color.black : Color.white);
                    // choose either black or white depending on brightness

                    l.setText(String.format("Color 0x%08x (%d,%d,%d alpha=%d)",
                        c.getRGB(), c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()));
                    return cell;
                }
                else if (e.getKey().endsWith("ont"))
                    // possible font, not always ".font"
                {
                    // fonts are weird, for some reason the value returned
                    // in the entry set of UIManager.getDefaults()
                    // is not the same type as the value "v" below                  
                    Object v = UIManager.get(e.getKey());
                    if (v instanceof javax.swing.plaf.FontUIResource)
                    {
                        javax.swing.plaf.FontUIResource font = 
                            (javax.swing.plaf.FontUIResource)v;
                        l.setText("Font "+font.getFontName()+" "+font.getSize());
                    }
                }
            }

            setDefaultColors(cell, isSelected);

            return cell;
        }
    }   

    public static void main(String[] args) {
        final EventList<UIEntry> uiEntryList = 
            GlazedLists.threadSafeList(new BasicEventList<UIEntry>());

        for (Map.Entry<Object,Object> key : UIManager.getDefaults().entrySet())
        {
            uiEntryList.add(new UIEntry(key));
        }

        final SortedList<UIEntry> sortedUIEntryList = new SortedList<UIEntry>(uiEntryList, null);

        // build a JTable
        String[] propertyNames = new String[] {"key","value","className"};
        String[] columnLabels = new String[] {"Key", "Value", "Class"};
        TableFormat<UIEntry> tf = GlazedLists.tableFormat(UIEntry.class, propertyNames, columnLabels);
        EventTableModel<UIEntry> etm = new EventTableModel<UIEntry>(sortedUIEntryList, tf);

        JTable t = new JTable(etm);
        TableComparatorChooser<UIEntry> tcc = TableComparatorChooser.install(t, 
                sortedUIEntryList, AbstractTableComparatorChooser.SINGLE_COLUMN,
                tf);
        sortedUIEntryList.setComparator(tcc.getComparatorsForColumn(0).get(0));
        // default to sort by the key

        t.setDefaultRenderer(Object.class, new UIEntryRenderer());        

        JFrame f = new JFrame("UI Manager Defaults Viewer");
        // show the frame
        f.add(new JScrollPane(t));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);     
    }

}

This program is the best I've seen for visualizing the UIManager values (e.g. Fonts, Colors, Borders): http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/

It lacks search, but it can filter by component or value type, which is pretty great.

They are kind of Look and Feel implementation dependent. Look in BasicLookAndFeel.java for the basic keys. Don't expect all PL&F to behave the same, or even remain the same between versions.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top