2009-04-08 15 views
19

Y at-il une liste quelque part des clés UIManager.getColor() pour Swing? Je n'arrive pas à le trouver en ligne, juste des références occasionnelles à des chaînes comme "Panel.background" et "Table.selectionBackground".Swing touches UIManager.getColor()

+1

J'ai trouvé une application Java Web Start pratique qui devrait aider: http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/ –

Répondre

0

Ils sont en quelque sorte dépendants de l'implémentation de la fonction de présentation. Regardez dans BasicLookAndFeel.java pour les clés de base. Ne vous attendez pas à ce que tous les PL & F se comportent de la même manière ou restent identiques d'une version à l'autre.

6

Je ne pense pas qu'il existe un jeu de clés standard défini. Mais vous pouvez essayer ce morceau de code à la liste ceux qui sont actuellement disponibles dans l'ordre alphabétique:

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

Cela produit une liste trop longue pour être reproduite ici.

+0

Actuellement (jdk1.8.0_45), pour 'systemLookAndFeelClassName = com. sun.java.swing.plaf.windows.WindowsLookAndFeel', les classes ne sont pas 'java.awt.Color', mais' com.sun.java.swing.plaf.windows.DesktopProperty', à défaut de l'instanceof vérifier malheureusement. –

4

@mmyers m'a inspiré. Voici un petit programme pour lister les valeurs par défaut d'UIManager dans une table triable.

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

} 
+0

Dans le générateur d'interface graphique NetBeans, lorsque vous modifiez une couleur, vous pouvez sélectionner une liste JList avec toutes les listes (sans les valeurs de couleur réelles). C'est en fait là que j'ai eu l'idée qu'il serait peut-être possible de les lister. Une table est beaucoup plus agréable, cependant. –