📄 synthspinnerui.java
字号:
/* * @(#)SynthSpinnerUI.java 1.17 07/12/07 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.synth;import java.awt.*;import java.awt.event.*;import java.text.ParseException;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.*;import javax.swing.plaf.basic.BasicSpinnerUI;import javax.swing.text.*;import java.beans.*;import java.text.*;import java.util.*;import sun.swing.plaf.synth.SynthUI;/** * Synth's SpinnerUI. * * @version 1.17, 12/07/07 * @author Hans Muller * @author Joshua Outwater */class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, SynthUI { private SynthStyle style; /** * A FocusListener implementation which causes the entire spinner to be * repainted whenever the editor component (typically a text field) becomes * focused, or loses focus. This is necessary because since SynthSpinnerUI * is composed of an editor and two buttons, it is necessary that all three * components indicate that they are "focused" so that they can be drawn * appropriately. The repaint is used to ensure that the buttons are drawn * in the new focused or unfocused state, mirroring that of the editor. */ private EditorFocusHandler editorFocusHandler = new EditorFocusHandler(); /** * Returns a new instance of SynthSpinnerUI. * * @param c the JSpinner (not used) * @see ComponentUI#createUI * @return a new SynthSpinnerUI object */ public static ComponentUI createUI(JComponent c) { return new SynthSpinnerUI(); } protected void installListeners() { super.installListeners(); spinner.addPropertyChangeListener(this); JComponent editor = spinner.getEditor(); if (editor instanceof JSpinner.DefaultEditor) { JTextField tf = ((JSpinner.DefaultEditor)editor).getTextField(); if (tf != null) { tf.addFocusListener(editorFocusHandler); } } } /** * Removes the <code>propertyChangeListener</code> added * by installListeners. * <p> * This method is called by <code>uninstallUI</code>. * * @see #installListeners */ protected void uninstallListeners() { super.uninstallListeners(); spinner.removePropertyChangeListener(this); JComponent editor = spinner.getEditor(); if (editor instanceof JSpinner.DefaultEditor) { JTextField tf = ((JSpinner.DefaultEditor)editor).getTextField(); if (tf != null) { tf.removeFocusListener(editorFocusHandler); } } } /** * Initialize the <code>JSpinner</code> <code>border</code>, * <code>foreground</code>, and <code>background</code>, properties * based on the corresponding "Spinner.*" properties from defaults table. * The <code>JSpinners</code> layout is set to the value returned by * <code>createLayout</code>. This method is called by <code>installUI</code>. * * @see #uninstallDefaults * @see #installUI * @see #createLayout * @see LookAndFeel#installBorder * @see LookAndFeel#installColors */ protected void installDefaults() { LayoutManager layout = spinner.getLayout(); if (layout == null || layout instanceof UIResource) { spinner.setLayout(createLayout()); } updateStyle(spinner); } private void updateStyle(JSpinner c) { SynthContext context = getContext(c, ENABLED); SynthStyle oldStyle = style; style = SynthLookAndFeel.updateStyle(context, this); if (style != oldStyle) { if (oldStyle != null) { // Only call installKeyboardActions as uninstall is not // public. installKeyboardActions(); } } context.dispose(); } /** * Sets the <code>JSpinner's</code> layout manager to null. This * method is called by <code>uninstallUI</code>. * * @see #installDefaults * @see #uninstallUI */ protected void uninstallDefaults() { if (spinner.getLayout() instanceof UIResource) { spinner.setLayout(null); } SynthContext context = getContext(spinner, ENABLED); style.uninstallDefaults(context); context.dispose(); style = null; } protected LayoutManager createLayout() { return new SpinnerLayout(); } /** * Create a component that will replace the spinner models value * with the object returned by <code>spinner.getPreviousValue</code>. * By default the <code>previousButton</code> is a JButton * who's <code>ActionListener</code> updates it's <code>JSpinner</code> * ancestors model. If a previousButton isn't needed (in a subclass) * then override this method to return null. * * @return a component that will replace the spinners model with the * next value in the sequence, or null * @see #installUI * @see #createNextButton */ protected Component createPreviousButton() { JButton b = new SpinnerArrowButton(SwingConstants.SOUTH); b.setName("Spinner.previousButton"); installPreviousButtonListeners(b); return b; } /** * Create a component that will replace the spinner models value * with the object returned by <code>spinner.getNextValue</code>. * By default the <code>nextButton</code> is a JButton * who's <code>ActionListener</code> updates it's <code>JSpinner</code> * ancestors model. If a nextButton isn't needed (in a subclass) * then override this method to return null. * * @return a component that will replace the spinners model with the * next value in the sequence, or null * @see #installUI * @see #createPreviousButton */ protected Component createNextButton() { JButton b = new SpinnerArrowButton(SwingConstants.NORTH); b.setName("Spinner.nextButton"); installNextButtonListeners(b); return b; } /** * This method is called by installUI to get the editor component * of the <code>JSpinner</code>. By default it just returns * <code>JSpinner.getEditor()</code>. Subclasses can override * <code>createEditor</code> to return a component that contains * the spinner's editor or null, if they're going to handle adding * the editor to the <code>JSpinner</code> in an * <code>installUI</code> override. * <p> * Typically this method would be overridden to wrap the editor * with a container with a custom border, since one can't assume * that the editors border can be set directly. * <p> * The <code>replaceEditor</code> method is called when the spinners * editor is changed with <code>JSpinner.setEditor</code>. If you've * overriden this method, then you'll probably want to override * <code>replaceEditor</code> as well. * * @return the JSpinners editor JComponent, spinner.getEditor() by default * @see #installUI * @see #replaceEditor * @see JSpinner#getEditor */ protected JComponent createEditor() { JComponent editor = spinner.getEditor(); editor.setName("Spinner.editor"); updateEditorAlignment(editor); return editor; } /** * Called by the <code>PropertyChangeListener</code> when the * <code>JSpinner</code> editor property changes. It's the responsibility * of this method to remove the old editor and add the new one. By * default this operation is just: * <pre> * spinner.remove(oldEditor); * spinner.add(newEditor, "Editor"); * </pre> * The implementation of <code>replaceEditor</code> should be coordinated
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -