Substance look and feel - documentation
Author: substance.dev.java.net
Description: Substance look and feel
Keywords: java, look, feel, skins, plaf, swing, ui, pluggable, substance

# Substance client properties

View all API methods.

View all client properties.

Client property name | SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE
Description | Property name for specifying the combobox popup prototype display value which is used to compute the width of the popup at runtime. The property value should be one of: `ComboPopupPrototypeCallback` - will provide application-specific logic at runtime. `Object` - will point to the prototype entry itself. This property can be set either on a specific `JComboBox` or globally on `UIManager`.
See also | COMBO_BOX_POPUP_FLYOUT_ORIENTATION client property.
Sample code | `import java.awt.FlowLayout; import java.awt.GridLayout; import javax.swing.*; import org.jvnet.substance.SubstanceLookAndFeel; import org.jvnet.substance.api.combo.ComboPopupPrototypeCallback; import org.jvnet.substance.api.combo.WidestComboPopupPrototype; import org.jvnet.substance.skin.BusinessBlackSteelSkin; /** * Test application that shows the use of the * {@link SubstanceLookAndFeel#COMBO_POPUP_PROTOTYPE} client property. * * @author Kirill Grouchnikov * @see SubstanceLookAndFeel#COMBO_POPUP_PROTOTYPE */ public class ComboPopupPrototype extends JFrame { /** * Creates the main frame for <code>this</code> sample. */ public ComboPopupPrototype() { super("Combo popup prototype"); this.setLayout(new GridLayout(1, 3)); JPanel panel1 = new JPanel(new FlowLayout()); JComboBox comboProto1 = new JComboBox(new Object[] { "aa", "aaaaa", "aaaaaaaaaa", "this one is the one", "abcdefghijklmnopqrstuvwxyz" }); comboProto1.setPrototypeDisplayValue("aaaaa"); // set popup prototype as hard-code value in the model comboProto1.putClientProperty( SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE, "this one is the one"); panel1.add(new JLabel("Hard-coded value")); panel1.add(comboProto1); this.add(panel1); JPanel panel2 = new JPanel(new FlowLayout()); JComboBox comboProto2 = new JComboBox(new Object[] { "aa", "aaaaa", "aaaaaaaaaa", "another one (not it)", "abcdefghijklmnopqrstuvwxyz" }); comboProto2.setPrototypeDisplayValue("aaaaa"); // set popup prototype as widest value (core implementation of // ComboPopupPrototypeCallback interface) comboProto2.putClientProperty( SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE, new WidestComboPopupPrototype()); panel2.add(new JLabel("Widest core callback")); panel2.add(comboProto2); this.add(panel2); JPanel panel3 = new JPanel(new FlowLayout()); JComboBox comboProto3 = new JComboBox(new Object[] { "aa", "aaaaa", "this is not", "this one is not it", "this one is it that is for the popup" }); comboProto3.setPrototypeDisplayValue("aaaaa"); // set popup prototype as custom implementation of // ComboPopupPrototypeCallback interface comboProto3.putClientProperty( SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE, new ComboPopupPrototypeCallback() { public Object getPopupPrototypeDisplayValue(JComboBox jc) { return jc.getModel().getElementAt( jc.getModel().getSize() - 1); } }); panel3.add(new JLabel("Custom callback")); panel3.add(comboProto3); this.add(panel3); this.setSize(400, 200); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /** * The main method for <code>this</code> sample. The arguments are ignored. * * @param args * Ignored. */ public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); SwingUtilities.invokeLater(new Runnable() { public void run() { SubstanceLookAndFeel.setSkin(new BusinessBlackSteelSkin()); new ComboPopupPrototype().setVisible(true); } }); } }` The screenshot below shows popup prototype set to a model entry: The screenshot below shows popup prototype set to the widest entry (core `WidestComboPopupPrototype` implementation of the `ComboPopupPrototypeCallback` interface): The screenshot below shows popup prototype set to the widest entry (custom implementation of `ComboPopupPrototypeCallback` interface):