views:

2683

answers:

4

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".

A: 

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.

Tom Hawtin - tackline
+2  A: 

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.

Michael Myers
Simple and elegant! Thanks!
Jason S
+2  A: 

@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);  
    }

}
Jason S
In the NetBeans GUI builder, when you edit a color you can pick from a JList with all of these listed (without the actual color values). That's actually where I got the idea that it might be possible to list them. A table is much nicer, though.
Michael Myers