📄 basiccomboboxui.java
字号:
/* * @(#)BasicComboBoxUI.java 1.155 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.basic;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.accessibility.*;import javax.swing.FocusManager;import javax.swing.plaf.*;import javax.swing.border.*;import javax.swing.text.*;import javax.swing.event.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import sun.awt.AppContext;/** * Basic UI implementation for JComboBox. * <p> * The combo box is a compound component which means that it is an agregate of * many simpler components. This class creates and manages the listeners * on the combo box and the combo box model. These listeners update the user * interface in response to changes in the properties and state of the combo box. * <p> * All event handling is handled by listener classes created with the * <code>createxxxListener()</code> methods and internal classes. * You can change the behavior of this class by overriding the * <code>createxxxListener()</code> methods and supplying your own * event listeners or subclassing from the ones supplied in this class. * <p> * For adding specific actions, * overide <code>installKeyboardActions</code> to add actions in response to * KeyStroke bindings. See the article <a href="http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html">Keyboard Bindings in Swing</a> * at <a href="http://java.sun.com/products/jfc/tsc"><em>The Swing Connection</em></a>. * * @version 1.155 01/23/03 * @author Arnaud Weber * @author Tom Santos * @author Mark Davidson */public class BasicComboBoxUI extends ComboBoxUI { protected JComboBox comboBox; /** * This protected field is implementation specific. Do not access directly * or override. */ protected boolean hasFocus = false; // Control the selection behavior of the JComboBox when it is used // in the JTable DefaultCellEditor. private boolean isTableCellEditor = false; private static final String IS_TABLE_CELL_EDITOR = "JComboBox.isTableCellEditor"; // This list is for drawing the current item in the combo box. protected JList listBox; // Used to render the currently selected item in the combo box. // It doesn't have anything to do with the popup's rendering. protected CellRendererPane currentValuePane = new CellRendererPane(); // The implementation of ComboPopup that is used to show the popup. protected ComboPopup popup; // The Component that the ComboBoxEditor uses for editing protected Component editor; // The arrow button that invokes the popup. protected JButton arrowButton; // Listeners that are attached to the JComboBox /** * This protected field is implementation specific. Do not access directly * or override. Override the listener construction method instead. * * @see #createKeyListener */ protected KeyListener keyListener; /** * This protected field is implementation specific. Do not access directly * or override. Override the listener construction method instead. * * @see #createFocusListener */ protected FocusListener focusListener; /** * This protected field is implementation specific. Do not access directly * or override. Override the listener construction method instead. * * @see #createPropertyChangeListener */ protected PropertyChangeListener propertyChangeListener; private FocusListener editorFocusListener; private ActionListener editorActionListener; /** * This protected field is implementation specific. Do not access directly * or override. Override the listener construction method instead. * * @see #createItemListener */ protected ItemListener itemListener; // Listeners that the ComboPopup produces. protected MouseListener popupMouseListener; protected MouseMotionListener popupMouseMotionListener; protected KeyListener popupKeyListener; // This is used for knowing when to cache the minimum preferred size. // If the data in the list changes, the cached value get marked for recalc. // Added to the current JComboBox model /** * This protected field is implementation specific. Do not access directly * or override. Override the listener construction method instead. * * @see #createListDataListener */ protected ListDataListener listDataListener; // Flag for recalculating the minimum preferred size. protected boolean isMinimumSizeDirty = true; // Cached minimum preferred size. protected Dimension cachedMinimumSize = new Dimension( 0, 0 ); // Flag for calculating the display size private boolean isDisplaySizeDirty = true; // Cached the size that the display needs to render the largest item private Dimension cachedDisplaySize = new Dimension( 0, 0 ); // Key used for lookup of the DefaultListCellRenderer in the AppContext. private static final Object COMBO_UI_LIST_CELL_RENDERER_KEY = new StringBuffer("DefaultListCellRendererKey"); // Used for calculating the default size. private static ListCellRenderer getDefaultListCellRenderer() { ListCellRenderer renderer = (ListCellRenderer)AppContext. getAppContext().get(COMBO_UI_LIST_CELL_RENDERER_KEY); if (renderer == null) { renderer = new DefaultListCellRenderer(); AppContext.getAppContext().put(COMBO_UI_LIST_CELL_RENDERER_KEY, new DefaultListCellRenderer()); } return renderer; } //======================== // begin UI Initialization // public static ComponentUI createUI(JComponent c) { return new BasicComboBoxUI(); } public void installUI( JComponent c ) { isMinimumSizeDirty = true; comboBox = (JComboBox)c; installDefaults(); popup = createPopup(); listBox = popup.getList(); // Is this combo box a cell editor? Boolean inTable = (Boolean)c.getClientProperty(IS_TABLE_CELL_EDITOR ); if (inTable != null) { isTableCellEditor = inTable.equals(Boolean.TRUE) ? true : false; } if ( comboBox.getRenderer() == null || comboBox.getRenderer() instanceof UIResource ) { comboBox.setRenderer( createRenderer() ); } if ( comboBox.getEditor() == null || comboBox.getEditor() instanceof UIResource ) { comboBox.setEditor( createEditor() ); } installListeners(); installComponents(); comboBox.setLayout( createLayoutManager() ); comboBox.setRequestFocusEnabled( true ); installKeyboardActions(); } public void uninstallUI( JComponent c ) { setPopupVisible( comboBox, false); popup.uninstallingUI(); uninstallKeyboardActions(); comboBox.setLayout( null ); uninstallComponents(); uninstallListeners(); uninstallDefaults(); if ( comboBox.getRenderer() == null || comboBox.getRenderer() instanceof UIResource ) { comboBox.setRenderer( null ); } if ( comboBox.getEditor() == null || comboBox.getEditor() instanceof UIResource ) { comboBox.setEditor( null ); } keyListener = null; focusListener = null; listDataListener = null; propertyChangeListener = null; editorActionListener = null; editorFocusListener = null; popup = null; listBox = null; comboBox = null; } /** * Installs the default colors, default font, default renderer, and default * editor into the JComboBox. */ protected void installDefaults() { LookAndFeel.installColorsAndFont( comboBox, "ComboBox.background", "ComboBox.foreground", "ComboBox.font" ); LookAndFeel.installBorder( comboBox, "ComboBox.border" ); } /** * Create and install the listeners for the combo box and its model. * This method is called when the UI is installed. */ protected void installListeners() { if ( (itemListener = createItemListener()) != null) { comboBox.addItemListener( itemListener ); } if ( (propertyChangeListener = createPropertyChangeListener()) != null ) { comboBox.addPropertyChangeListener( propertyChangeListener ); } if ( (keyListener = createKeyListener()) != null ) { comboBox.addKeyListener( keyListener ); } if ( (focusListener = createFocusListener()) != null ) { comboBox.addFocusListener( focusListener ); } if ((popupMouseListener = popup.getMouseListener()) != null) { comboBox.addMouseListener( popupMouseListener ); } if ((popupMouseMotionListener = popup.getMouseMotionListener()) != null) { comboBox.addMouseMotionListener( popupMouseMotionListener ); } if ((popupKeyListener = popup.getKeyListener()) != null) { comboBox.addKeyListener(popupKeyListener); } if ( comboBox.getModel() != null ) { if ( (listDataListener = createListDataListener()) != null ) { comboBox.getModel().addListDataListener( listDataListener ); } } } /** * Uninstalls the default colors, default font, default renderer, and default * editor into the JComboBox. */ protected void uninstallDefaults() { LookAndFeel.installColorsAndFont( comboBox, "ComboBox.background", "ComboBox.foreground", "ComboBox.font" ); LookAndFeel.uninstallBorder( comboBox ); } /** * Remove the installed listeners from the combo box and its model. * The number and types of listeners removed and in this method should be * the same that was added in <code>installListeners</code> */ protected void uninstallListeners() { if ( keyListener != null ) { comboBox.removeKeyListener( keyListener ); } if ( itemListener != null) { comboBox.removeItemListener( itemListener ); } if ( propertyChangeListener != null ) { comboBox.removePropertyChangeListener( propertyChangeListener ); } if ( focusListener != null) { comboBox.removeFocusListener( focusListener ); } if ( popupMouseListener != null) { comboBox.removeMouseListener( popupMouseListener ); } if ( popupMouseMotionListener != null) { comboBox.removeMouseMotionListener( popupMouseMotionListener ); } if (popupKeyListener != null) { comboBox.removeKeyListener(popupKeyListener); } if ( comboBox.getModel() != null ) { if ( listDataListener != null ) { comboBox.getModel().removeListDataListener( listDataListener ); } } } /** * Creates the popup portion of the combo box. * * @return an instance of <code>ComboPopup</code> * @see ComboPopup */ protected ComboPopup createPopup() { BasicComboPopup popup = new BasicComboPopup( comboBox ); popup.getAccessibleContext().setAccessibleParent(comboBox); return popup; } /** * Creates a <code>KeyListener</code> which will be added to the * combo box. If this method returns null then it will not be added * to the combo box. * * @return an instance <code>KeyListener</code> or null */ protected KeyListener createKeyListener() { return new KeyHandler(); } /** * Creates a <code>FocusListener</code> which will be added to the combo box. * If this method returns null then it will not be added to the combo box. * * @return an instance of a <code>FocusListener</code> or null */ protected FocusListener createFocusListener() { return new FocusHandler(); } /** * Creates a list data listener which will be added to the * <code>ComboBoxModel</code>. If this method returns null then * it will not be added to the combo box model. * * @return an instance of a <code>ListDataListener</code> or null */ protected ListDataListener createListDataListener() { return new ListDataHandler(); } /** * Creates an <code>ItemListener</code> which will be added to the * combo box. If this method returns null then it will not * be added to the combo box. * <p> * Subclasses may override this method to return instances of their own * ItemEvent handlers. * * @return an instance of an <code>ItemListener</code> or null */ protected ItemListener createItemListener() { return null; } /** * Creates a <code>PropertyChangeListener</code> which will be added to * the combo box. If this method returns null then it will not * be added to the combo box. * * @return an instance of a <code>PropertyChangeListener</code> or null */ protected PropertyChangeListener createPropertyChangeListener() { return new PropertyChangeHandler(); } /** * 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 ComboBoxLayoutManager(); } /** * Creates the default renderer that will be used in a non-editiable combo * box. A default renderer will used only if a renderer has not been
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -