windowscomboboxui.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 507 行 · 第 1/2 页

JAVA
507
字号
                        false,                         false );             }             c.setFont(comboBox.getFont());             if ( comboBox.isEnabled() ) {                 c.setForeground(comboBox.getForeground());                 c.setBackground(comboBox.getBackground());             } else {                 c.setForeground(DefaultLookup.getColor(                          comboBox, this, "ComboBox.disabledForeground", null));                 c.setBackground(DefaultLookup.getColor(                          comboBox, this, "ComboBox.disabledBackground", null));             }             boolean shouldValidate = false;             if (c instanceof JPanel)  {                 shouldValidate = true;             }             currentValuePane.paintComponent(g, c, comboBox, bounds.x, bounds.y,                                    bounds.width, bounds.height, shouldValidate);                      } else {             super.paintCurrentValue(g, bounds, hasFocus);         }     }        @Override    public void paintCurrentValueBackground(Graphics g, Rectangle bounds,                                             boolean hasFocus) {         if (XPStyle.getXP() == null) {             super.paintCurrentValueBackground(g, bounds, hasFocus);         }     }        public Dimension getPreferredSize( JComponent c ) {        Dimension d = super.getPreferredSize(c);        d.width += 4;        d.height += 2;        if (XPStyle.getXP() != null) {            d.height += 2;        }        return d;    }    /**     * Creates a layout manager for managing the components which make up the      * combo box.     *      * @return an instance of a layout manager     */    protected LayoutManager createLayoutManager() {        return new BasicComboBoxUI.ComboBoxLayoutManager() {	    public void layoutContainer(Container parent) {		super.layoutContainer(parent);		if (XPStyle.getXP() != null && arrowButton != null) {		    Dimension d = parent.getSize();		    Insets insets = getInsets();		    int buttonWidth = arrowButton.getPreferredSize().width;		    arrowButton.setBounds(WindowsUtils.isLeftToRight((JComboBox)parent)					  ? (d.width - insets.right - buttonWidth)					  : insets.left,					  insets.top,					  buttonWidth, d.height - insets.top - insets.bottom);		}	    }	};    }    protected void installKeyboardActions() {        super.installKeyboardActions();    }    protected ComboPopup createPopup() {        return super.createPopup();    }    /**     * Creates the default editor that will be used in editable combo boxes.       * A default editor will be used only if an editor has not been      * explicitly set with <code>setEditor</code>.     *     * @return a <code>ComboBoxEditor</code> used for the combo box     * @see javax.swing.JComboBox#setEditor     */    protected ComboBoxEditor createEditor() {	return new WindowsComboBoxEditor();    }     @Override     protected ListCellRenderer createRenderer() {        XPStyle xp = XPStyle.getXP();        if (xp != null && xp.isSkinDefined(comboBox, Part.CP_READONLY)) {            return new WindowsComboBoxRenderer();        } else {            return super.createRenderer();        }    }    /**     * Creates an button which will be used as the control to show or hide     * the popup portion of the combo box.     *     * @return a button which represents the popup control     */    protected JButton createArrowButton() {	if (XPStyle.getXP() != null) {	    return new XPComboBoxButton();	} else {	    return super.createArrowButton();	}    }    private class XPComboBoxButton extends XPStyle.GlyphButton {        public XPComboBoxButton() {            super(null,                    (! XPStyle.getXP().isSkinDefined(comboBox, Part.CP_DROPDOWNBUTTONRIGHT))                   ? Part.CP_DROPDOWNBUTTON                    : (comboBox.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)                      ? Part.CP_DROPDOWNBUTTONLEFT                      : Part.CP_DROPDOWNBUTTONRIGHT                   ); 	    setRequestFocusEnabled(false);	}           @Override         protected State getState() {            State rv;            rv = super.getState();             if (rv != State.DISABLED                 && ! comboBox.isEditable()                  && XPStyle.getXP().isSkinDefined(comboBox,                                                  Part.CP_DROPDOWNBUTTONRIGHT)) {                /*                  * for non editable ComboBoxes Vista seems to have the                  * same glyph for all non DISABLED states                  */                 rv = State.NORMAL;            }              return rv;        }        public Dimension getPreferredSize() {            return new Dimension(17, 20);        }        void setPart(Part part) {            setPart(comboBox, part);        }        WindowsComboBoxUI getWindowsComboBoxUI() {            return WindowsComboBoxUI.this;        }    }    /**      * Subclassed to add Windows specific Key Bindings.     * This class is now obsolete and doesn't do anything.      * Only included for backwards API compatibility.     * Do not call or override.     *      * @deprecated As of Java 2 platform v1.4.     */    @Deprecated    protected class WindowsComboPopup extends BasicComboPopup {        public WindowsComboPopup( JComboBox cBox ) {            super( cBox );        }        protected KeyListener createKeyListener() {            return new InvocationKeyHandler();        }        protected class InvocationKeyHandler extends BasicComboPopup.InvocationKeyHandler {	    protected InvocationKeyHandler() {		WindowsComboPopup.this.super();	    }        }    }    /**      * Subclassed to highlight selected item in an editable combo box.     */    public static class WindowsComboBoxEditor        extends BasicComboBoxEditor.UIResource {        public void setItem(Object item) {            super.setItem(item);            if (editor.hasFocus()) {                editor.selectAll();            }        }    }    /**      * Subclassed to set opacity {@code false} on the renderer      * and to show border for focused cells.      */     private static class WindowsComboBoxRenderer            extends BasicComboBoxRenderer.UIResource {         private static final Object BORDER_KEY = new StringBuilder("BORDER_KEY");         private static final Border NULL_BORDER = new EmptyBorder(0, 0, 0, 0);         /**          * {@inheritDoc}          */         @Override          public Component getListCellRendererComponent(                                                  JList list,                                                   Object value,                                                  int index,                                                   boolean isSelected,                                                   boolean cellHasFocus) {             Component rv =                  super.getListCellRendererComponent(list, value, index,                                                     isSelected, cellHasFocus);             if (rv instanceof JComponent) {                 JComponent component = (JComponent) rv;                 if (index == -1 && isSelected) {                     Border border = component.getBorder();                     Border dashedBorder =                          new WindowsBorders.DashedBorder(list.getForeground());                     component.setBorder(dashedBorder);                     //store current border in client property if needed                     if (component.getClientProperty(BORDER_KEY) == null) {                         component.putClientProperty(BORDER_KEY,                                         (border == null) ? NULL_BORDER : border);                     }                 } else {                     if (component.getBorder() instanceof                            WindowsBorders.DashedBorder) {                         Object storedBorder = component.getClientProperty(BORDER_KEY);                         if (storedBorder instanceof Border) {                             component.setBorder(                                 (storedBorder == NULL_BORDER) ? null                                      : (Border) storedBorder);                         }                         component.putClientProperty(BORDER_KEY, null);                     }                 }                 if (index == -1) {                     component.setOpaque(false);                     component.setForeground(list.getForeground());                 } else {                     component.setOpaque(true);                 }             }             return rv;         }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?