Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

API Swing изменяется в JDK 5.0

Изменения API в Swing для J2SE 5.0 разламываются на следующие разделы:

  1. Существенные изменения
  2. Текстовые Изменения
  3. Разные Изменения
  4. Несовместимости

Главные Изменения Swing

4607364: Улучшите стиль по умолчанию Swing

Описание:

Это - самое видимое изменение к Swing в 5.0. Если Вы будете использовать стиль Java, то Ваше приложение автоматически получит новый взгляд, названный Океаном, в 5.0. Океан был разработан с совместимостью в памяти так, чтобы мы не изменяли привилегированный размер любого из виджетов, только взгляд и небольшая часть чувства изменились. Старый взгляд может быть получен, устанавливая системное свойство swing.metalTheme=steel.

Океан реализуется как пользовательский MetalTheme, который является в настоящий момент частным. Преимущество этого подхода - это, если Вы создали пользовательское MetalTheme на Вас не будет влиять вообще Океан, то есть, Ваше приложение будет смотреть, как это сделало в 1.4.

Спецификация

Отключенные Значки для подклассов AbstractButton теперь сгенерированы от UI. Это привело к пересмотру спецификации getDisabledIcon к:

    /**
     * Returns the icon used by the button when it's disabled.
     * If no disabled icon has been set this will forward the call to
     * the ui to construct an appropriate disabled Icon.
     * <p>
     * Some types of look and feel might not render the disabled Icon, in which
     * case they will ignore this.
     *
     * @return the <code>disabledIcon</code> property
     * @see #getPressedIcon
     * @see #setDisabledIcon
     * @see javax.swing.plaf.ButtonUI#getDisabledIcon
     */
    public Icon getDisabledIcon();

И добавление метода getDisabledIcon к ButtonUI.

    /**
     * Returns the icon to display when the developer has not specified
     * a disabled icon.
     * <p>
     * Some look and feels might not render the disabled Icon, in which
     * case they will ignore this.
     *
     * @param button AbstractButton requesting the Icon
     * @return Disabled icon, or null.
     * @see javax.swing.AbstractButton#setIcon
     * @see javax.swing.AbstractButton#setDisabledIcon
     * @throws NullPointerException if <code>button</code> is null
     * @since 1.5
     */
    public Icon getDisabledIcon(AbstractButton button);

Чтобы настроить вид отключенных значков для JButtonMetalButtonUI, переопределит getDisabledIcon.

    /**
     * Returns the icon to display when the button is disabled.
     *
     * @param button AbstractButton requesting the Icon
     * @return Disabled icon, or null.
     * @see javax.swing.AbstractButton#setIcon
     * @see javax.swing.AbstractButton#setDisabledIcon
     * @throws NullPointerException if <code>button</code> is null
     * @since 1.5
     */
    public Icon getDisabledIcon(AbstractButton button);

Чтобы настроить вид JComboBoxMetalCombBoxUI, переопределит следующие методы:

    /**
     * If necessary paints the currently selected item.
     *
     * @param g Graphics to paint to
     * @param bounds Region to paint current value to
     * @param hasFocus whether or not the JComboBox has focus
     * @throws NullPointerException if any of the arguments are null.
     * @since 1.5
     */
    public void paintCurrentValue(Graphics g, Rectangle bounds,
                                  boolean hasFocus);

    /**
     * If necessary paints the background of the currently selected item.
     *
     * @param g Graphics to paint to
     * @param bounds Region to paint background to
     * @param hasFocus whether or not the JComboBox has focus
     * @throws NullPointerException if any of the arguments are null.
     * @since 1.5
     */
    public void paintCurrentValueBackground(Graphics g, Rectangle bounds,
                                            boolean hasFocus);

Чтобы настроить вид JButtonMetalButtonUI, переопределит следующие методы:

    /**
     * If necessary paints the background of the component, then
     * invokes <code>paint</code>.
     *
     * @param g Graphics to paint to
     * @param c JComponent painting on
     * @throws NullPointerException if <code>g</code> or <code>c</code> is
     *         null
     * @see javax.swing.plaf.ComponentUI#update
     * @see javax.swing.plaf.ComponentUI#paint
     * @since 1.5
     */
    public void update(Graphics g, JComponent c);

Настроить вид металла JMenuBar теперь предоставит MetalMenuBarUI.

Чтобы настроить вид JToolBarMetalToolBarUI, теперь переопределит update.

    /**
     * If necessary paints the background of the component, then invokes
     * <code>paint</code>.
     *
     * @param g Graphics to paint to
     * @param c JComponent painting on
     * @throws NullPointerException if <code>g</code> or <code>c</code> is
     *         null
     * @see javax.swing.plaf.ComponentUI#update
     * @see javax.swing.plaf.ComponentUI#paint
     * @since 1.5
     */
    public void update(Graphics g, JComponent c);

Чтобы настроить вид JToggleButton MetalToggleButtonUI, теперь переопределит следующие методы:

    /**
     * If necessary paints the background of the component, then invokes
     * <code>paint</code>.
     *
     * @param g Graphics to paint to
     * @param c JComponent painting on
     * @throws NullPointerException if <code>g</code> or <code>c</code> is
     *         null
     * @see javax.swing.plaf.ComponentUI#update
     * @see javax.swing.plaf.ComponentUI#paint
     * @since 1.5
     */
    public void update(Graphics g, JComponent c);

    /**
     * Paints the appropriate icon of the button <code>b</code> in the
     * space <code>iconRect</code>.
     *
     * @param g Graphics to paint to
     * @param b Button to render for
     * @param iconRect space to render in
     * @throws NullPointerException if any of the arguments are null.
     * @since 1.5
     */
    protected void paintIcon(Graphics g, AbstractButton b, Rectangle iconRect);

    /**
     * Returns the icon to display when the button is disabled.
     *
     * @param button AbstractButton requesting the Icon
     * @return Disabled icon, or null.
     * @see javax.swing.AbstractButton#setIcon
     * @see javax.swing.AbstractButton#setDisabledIcon
     * @throws NullPointerException if <code>button</code> is null
     * @since 1.5
     */
    public Icon getDisabledIcon(AbstractButton button);

4632193: Стиль Swing Кожи

Описание:

Одной из ранних целей проекта Swing была возможность к приложению, чтобы поддерживать множество взгляда и чувств, не изменяя код. Эта функция позволяет разработчикам легко запускать свои приложения с многочисленным взглядом и чувствами. В то время как была горстка пользовательского взгляда и чувств, наиболее особенно Стиль Сплава и Стиль Со сменными окнами L2F's, создавая новый стиль требуют программирования и обширных знаний сменной архитектуры стили Swing, ограничивая эту функцию главным образом экспертами. В 5.0, стиль со сменными окнами, названный Синтезатором, был добавлен к Swing, который может быть полностью настроен, не пишущий код, включая даже непрограммистам создать новый взгляд и чувства.

Синтезатор живет в javax.swing.plaf.synth пакете. Уровень пакета javadoc дает краткий обзор Синтезатора Синтезатора, может быть настроен посредством файла. Чтобы позволить Синтезатору расширить javax.swing.plaf.basic, следующие изменения были произведены:

Следующие методы были ненужными (реализация, идентичная тому из суперкласса), и были удалены: getMaximumSize getPreferredSize BasicToolBarUI getMinimumSize BasicToolBarUI getMaximumSize BasicToolBarUI getMinimumSize BasicToolBarSeparatorUI getMinimumSize BasicToolBarSeparatorUI getMaximumSize BasicScrollBarUI getMinimumSize BasicListUI getMinimumSize BasicListUI getPreferredSize BasicScrollPaneUI getMaximumSize BasicScrollPaneUI getPreferredSize BasicPopupMenuUI getMinimumSize BasicPopupMenuUI getPreferredSize BasicPopupMenuUI getPreferredSize BasicMenuBarUI getMaximumSize BasicTabbedPaneUI getMinimumSize BasicOptionPaneUI BasicOptionPaneUI.

У многих из подклассов JComponent есть примитивные свойства. Поскольку UIs должен установить значение для этих свойств, которые у них нет никакого способа определить, было ли свойство установлено разработчиком и может закончить тем, что сбросило значение, разработчик определил. Позволять UI только установить значение, если разработчик не определил, что мы направим все примитивные методы set через метод в LookAndFeel:

    /**
     * Convenience method for installing a property with the specified name
     * and value on a component if that property has not already been set
     * by the client program.  This method is intended to be used by
     * UI delegate instances that need to specify a default value for a
     * property of primitive type (boolean, int, ..), but do not wish
     * to override a value set by the client.  Since primitive property
     * values cannot be wrapped with the UIResource marker, this method
     * uses private state to determine whether the property has been set
     * by the client.
     * @throws IllegalArgumentException if the specified property is not
     *         one which can be set using this method
     * @throws ClassCastException May be thrown if the propertyValue is not
     *         of the expected type.
     * @throws NullPointerException May be thrown if the JComponent is null,
     *         or the propertyValue is null.
     * @param c the target component for installing the property
     * @param propertyName String containing the name of the property to be set
     * @param propertyValue Object containing the value of the property
     * @since 1.5
     */
    public static void installProperty(JComponent c, 
                                       String propertyName, Object propertyValue)

Чтобы позволить подклассам BasicTabbedPaneUI создавать свои собственные кнопки, следующий метод был добавлен:

    /**
     * Creates and returns a JButton that will provide the user
     * with a way to scroll the tabs in a particular direction. The
     * returned JButton must be instance of UIResource.
     *
     * @param direction One of the SwingConstants constants:
     * SOUTH, NORTH, EAST or WEST
     * @return Widget for user to 
     * @see javax.swing.JTabbedPane#setTabPlacement
     * @see javax.swing.SwingConstants
     * @throws IllegalArgumentException if direction is not one of
     *         NORTH, SOUTH, EAST or WEST
     * @since 1.5
     */
    protected JButton createScrollButton(int direction);

Чтобы позволить подклассам BasicTabbedPaneUI определять, какая вкладка фокусируется, следующее было добавлено:

    /**
     * Returns the index of the tab that has focus.
     *
     * @return index of tab that has focus
     * @since 1.5
     */
    protected int getFocusIndex();

Чтобы позволить подклассам BasicTabbedPaneUI обеспечивать трансформацию производят следующее, был добавлен:

    /**
     * Sets the tab the mouse is currently over to index.
     * index will be -1 if the mouse is no longer over any
     * tab. No checking is done to ensure the passed in index identifies a
     * valid tab.
     *
     * @param index Index of the tab the mouse is over.
     * @since 1.5
     */
    protected void setRolloverTab(int index);

    /**
     * Returns the tab the mouse is currently over, or -1 if the mouse is no
     * longer over any tab.
     *
     * @param index Index of the tab the mouse is over.
     * @since 1.5
     */
    protected int getRolloverTab();

Следующее поле было добавлено к BasicColorChooserUI:

    /**
     * JColorChooser this BasicColorChooserUI is installed on.
     *
     * @since 1.5
     */
    protected JColorChooser chooser;

Чтобы позволить подклассам BasicSpinnerUI устанавливать свои собственные действия клавиатуры, следующий метод был добавлен:

    /**
     * Installs the keyboard Actions onto the JSpinner.
     *
     * @since 1.5
     */
    protected void installKeyboardActions();

Позволить подклассам BasicSpinnerUI обеспечивать свое собственное вращение застегивается, следующие методы были добавлены:

    /**
     * Installs the necessary listeners on the next button, c,
     * to update the JSpinner in response to a user gesture.
     *
     * @param c Component to install the listeners on
     * @throws NullPointerException if c is null.
     * @see #createNextButton
     * @since 1.5
     */
    protected void installNextButtonListeners(Component c);

    /**
     * Installs the necessary listeners on the previous button, c,
     * to update the JSpinner in response to a user gesture.
     *
     * @param c Component to install the listeners on.
     * @throws NullPointerException if c is null.
     * @see #createPreviousButton
     * @since 1.5
     */
    protected void installPreviousButtonListeners(Component c);

Чтобы позволить подклассам BasicScrollBarUI обеспечивать динамическую обратную связь следующий метод были добавлены:

    /**
     * Sets whether or not the mouse is currently over the thumb.
     *
     * @param active True indicates the thumb is currently active.
     * @since 1.5
     */
    protected void setThumbRollover(boolean active);

    /**
     * Returns true if the mouse is currently over the thumb.
     *
     * @return true if the thumb is currently active
     * @since 1.5
     */
    public boolean isThumbRollover();

    /**
     * Indicates whether the user can absolutely position the thumb with
     * a mouse gesture (usually the middle mouse button).
     *
     * @return true if a mouse gesture can absolutely position the thumb
     * @since 1.5
     */
    public boolean getSupportsAbsolutePositioning();

Сокращать класс загружается, следующее было добавлено к BasicComboPopup:

    /**
     * Gets the AccessibleContext associated with this BasicComboPopup.
     * The AccessibleContext will have its parent set to the ComboBox.
     *
     * @return an AccessibleContext for the BasicComboPopup
     * @since 1.5
     */
    public AccessibleContext getAccessibleContext();

Чтобы позволить подклассам BasicSplitPaneDivider обеспечить мышь по обратной связи, следующее было добавлено:

    /**
     * Sets whether or not the mouse is currently over the divider.
     *
     * @param mouseOver whether or not the mouse is currently over the divider
     * @since 1.5
     */
    protected void setMouseOver(boolean mouseOver);

    /**
     * Returns whether or not the mouse is currently over the divider
     *
     * @param Returns whether or not the mouse is currently over the divider
     */
    public boolean isMouseOver();

Чтобы позволить подклассам BasicTreeUI изменять расположение определенной строки, следующий был добавлен:

    /**
     * Returns the location, along the x-axis, to render a particular row
     * at. The return value does not include any Insets specified on the JTree.
     * This does not check for the validity of the row or depth, it is assumed
     * to be correct and will not throw an Exception if the row or depth
     * doesn't match that of the tree.
     *
     * @param row Row to return x location for
     * @param depth Depth of the row
     * @return amount to indent the given row.
     * @since 1.5
     */
    protected int getRowX(int row, int depth);

Чтобы позволить подклассам BasicProgressBarUI изменять размер индикатора выполнения, следующее было добавлено:

    /**                                                             
     * Used to hold the location and size of the bouncing box (returned
     * by getBox) to be painted.
     *
     * @since 1.5
     */                                                             
    protected Rectangle boxRect;

    /**
     * Returns the length
     * of the "bouncing box" to be painted.
     * This method is invoked by the 
     * default implementation of <code>paintIndeterminate</code>
     * to get the width (if the progress bar is horizontal)
     * or height (if vertical) of the box.
     * For example:
     * <blockquote>
     * <pre>
     *boxRect.width = getBoxLength(componentInnards.width,
     *                             componentInnards.height);
     * </pre>
     * </blockquote>
     *
     * @param availableLength  the amount of space available
     *                         for the bouncing box to move in;
     *                         for a horizontal progress bar,
     *                         for example,
     *                         this should be
     *                         the inside width of the progress bar
     *                         (the component width minus borders)
     * @param otherDimension   for a horizontal progress bar, this should be
     *                         the inside height of the progress bar; this
     *                         value might be used to constrain or determine
     *                         the return value 
     *
     * @return the size of the box dimension being determined; 
     *         must be no larger than <code>availableLength</code>
     *
     * @see javax.swing.SwingUtilities#calculateInnerArea
     * @since 1.5
     */
    protected int getBoxLength(int availableLength, int otherDimension);

Чтобы позволить подклассам BasicSliderUI специализировать рисование, основанное на состоянии ползунка, следующее было добавлено:

    /**
     * Returns true if the user is dragging the slider.
     *
     * @return true if the user is dragging the slider
     * @since 1.5
     */
    protected boolean isDragging();

Позволить подклассам BasicToolBarUI специализироваться, как окно, используемое для того, чтобы перетащить, красится следующее, было добавлено:

    /**
     * Paints the contents of the window used for dragging.
     *
     * @param g Graphics to paint to.
     * @throws NullPointerException is g is null
     * @since 1.5
     */
    protected void paintDragWindow(Graphics g);

Чтобы позволить подклассам BasicDesktopIconUI получать дескриптор к iconPane, следующее было добавлено:

    /**
     * The title pane component used in the desktop icon.
     *
     * @since 1.5
     */
    protected JComponent iconPane;

4634626: Контекст реализации открывает меню для компонентов

Описание:

JPopupMenu учитывает создание раскрывающегося меню. До 5.0, разработчики, использующие a JPopupMenu должен был бы установить необходимых слушателей и зарегистрировать соответствующие привязки клавиш, чтобы показать JPopupMenu. В 5.0 мы добавили механизм, чтобы заботиться о регистрации соответствующих слушателей и привязок клавиш. Это привело к следующим методам, добавляемым к JComponent:

    /**
     * Sets whether or not <code>getComponentPopupMenu</code> should delegate
     * to the parent if this component does not have a <code>JPopupMenu</code>
     * assigned to it.
     * <p>
     * The default value for this is false, but some <code>JComponent</code>
     * subclasses that are implemented as a number of <code>JComponent</code>s
     * may set this to true.
     * <p>
     * This is a bound property.
     *
     * @param value whether or not the JPopupMenu is inherited
     * @see #setComponentPopupMenu
     * @beaninfo
     *        bound: true
     *  description: Whether or not the JPopupMenu is inherited
     * @since 1.5
     */
    public void setInheritsPopupMenu(boolean value);

    /**
     * Returns true if the JPopupMenu should be inherited from the parent.
     *
     * @see #setComponentPopupMenu
     * @since 1.5
     */
    public boolean getInheritsPopupMenu();

    /**
     * Sets the <code>JPopupMenu</code> for this <code>JComponent</code>.
     * The UI is responsible for registering bindings and adding the necessary
     * listeners such that the <code>JPopupMenu</code> will be shown at
     * the appropriate time. When the <code>JPopupMenu</code> is shown
     * depends upon the look and feel: some may show it on a mouse event,
     * some may enable a key binding.
     * <p>
     * If <code>popup</code> is null, and <code>getInheritsPopupMenu</code>
     * returns true, then <code>getComponentPopupMenu</code> will be delegated
     * to the parent. This provides for a way to make all child components
     * inherit the popupmenu of the parent.
     * <p>
     * This is a bound property.
     *
     * @param popup - the popup that will be assigned to this component
     *                may be null
     * @see #getComponentPopupMenu
     * @beaninfo
     *        bound: true
     *    preferred: true
     *  description: Popup to show
     * @since 1.5
     */
    public void setComponentPopupMenu(JPopupMenu popup);

    /**
     * Returns <code>JPopupMenu</code> that assigned for this component.
     * If this component does not have a <code>JPopupMenu</code> assigned
     * to it and <code>getInheritsPopupMenu</code> is true, this
     * will return <code>getParent().getComponentPopupMenu()</code> (assuming
     * the parent is valid.)
     *
     * @return <code>JPopupMenu</code> assigned for this component
     *         or <code>null</code> if no popup assigned
     * @see #setComponentPopupMenu
     * @since 1.5
     */
    public JPopupMenu getComponentPopupMenu();

Следующее было добавлено к BasicLookAndFeel:

     /**
      * UIManager.setLookAndFeel calls this method before the first call
      * (and typically the only call) to getDefaults().
      *
      * @since 1.5
      */
     public void initialize() {

     /**
      * UIManager.setLookAndFeel calls this method just
      * before we're replaced by a new default look and feel.
      *
      * @since 1.5
      */
     public void uninitialize() {

4791650: JTable нуждается в поддержке печати

Описание:

Резюме говорит все это. Следующее было добавлено к JTable:

    /**
     * Printing modes, used in printing <code>JTable</code>s.
     *
     * @see #print(JTable.PrintMode, MessageFormat, MessageFormat,
     *             boolean, PrintRequestAttributeSet, boolean)
     * @see #getPrintable
     * @since 1.5
     */
    public enum PrintMode {

        /**
         * Printing mode that prints the table at its current size,
         * spreading both columns and rows across multiple pages if necessary.
         */
        NORMAL,
        
        /**
         * Printing mode that scales the output smaller, if necessary,
         * to fit the table's entire width (and thereby all columns) on each page;
         * Rows are spread across multiple pages as necessary.
         */
        FIT_WIDTH
    }
    /**
     * A convenience method that displays a printing dialog, and then prints
     * this <code>JTable</code> in mode <code>PrintMode.FIT_WIDTH</code>,
     * with no header or footer text. A modal progress dialog, with an abort
     * option, will be shown for the duration of printing.
     * <p>
     * Note: In headless mode, no dialogs will be shown.
     *
     * @return true, unless printing is cancelled by the user
     * @throws PrinterException if an error in the print system causes the job
     *                          to be aborted
     * @see #print(JTable.PrintMode, MessageFormat, MessageFormat,
     *             boolean, PrintRequestAttributeSet, boolean)
     * @see #getPrintable
     *
     * @since 1.5
     */
    public boolean print() throws PrinterException;

    /**
     * A convenience method that displays a printing dialog, and then prints
     * this <code>JTable</code> in the given printing mode,
     * with no header or footer text. A modal progress dialog, with an abort
     * option, will be shown for the duration of printing.
     * <p>
     * Note: In headless mode, no dialogs will be shown.
     *
     * @param  printMode        the printing mode that the printable should use
     * @return true, unless printing is cancelled by the user
     * @throws PrinterException if an error in the print system causes the job
     *                          to be aborted
     * @see #print(JTable.PrintMode, MessageFormat, MessageFormat,
     *             boolean, PrintRequestAttributeSet, boolean)
     * @see #getPrintable
     *
     * @since 1.5
     */
    public boolean print(PrintMode printMode) throws PrinterException;

    /**
     * A convenience method that displays a printing dialog, and then prints
     * this <code>JTable</code> in the given printing mode,
     * with the specified header and footer text. A modal progress dialog,
     * with an abort option, will be shown for the duration of printing.
     * <p>
     * Note: In headless mode, no dialogs will be shown.
     *
     * @param  printMode        the printing mode that the printable should use
     * @param  headerFormat     a <code>MessageFormat</code> specifying the text
     *                          to be used in printing a header,
     *                          or null for none
     * @param  footerFormat     a <code>MessageFormat</code> specifying the text
     *                          to be used in printing a footer,
     *                          or null for none
     * @return true, unless printing is cancelled by the user
     * @throws PrinterException if an error in the print system causes the job
     *                          to be aborted
     * @see #print(JTable.PrintMode, MessageFormat, MessageFormat,
     *             boolean, PrintRequestAttributeSet, boolean)
     * @see #getPrintable
     *
     * @since 1.5
     */
    public boolean print(PrintMode printMode,
                         MessageFormat headerFormat,
                         MessageFormat footerFormat) throws PrinterException;

    /**
     * Print this <code>JTable</code>. Takes steps that the majority of
     * developers would take in order to print a <code>JTable</code>.
     * In short, it prepares the table, calls <code>getPrintable</code> to
     * fetch an appropriate <code>Printable</code>, and then sends it to the
     * printer.
     * <p>
     * A <code>boolean</code> parameter allows you to specify whether or not
     * a printing dialog is displayed to the user. When it is, the user may
     * use the dialog to change printing attributes or even cancel the print.
     * Another parameter allows for printing attributes to be specified
     * directly. This can be used either to provide the initial values for the
     * print dialog, or to supply any needed attributes when the dialog is not
     * shown.
     * <p>
     * A second <code>boolean</code> parameter allows you to specify whether
     * or not to perform printing in an interactive mode. If <code>true</code>,
     * a modal progress dialog, with an abort option, is displayed for the
     * duration of printing . This dialog also prevents any user action which
     * may affect the table. However, it can not prevent the table from being
     * modified by code (for example, another thread that posts updates using
     * <code>SwingUtilities.invokeLater</code>). It is therefore the
     * responsibility of the developer to ensure that no other code modifies
     * the table in any way during printing (invalid modifications include
     * changes in: size, renderers, or underlying data). Printing behavior is
     * undefined when the table is changed during printing.
     * <p>
     * If <code>false</code> is specified for this parameter, no dialog will
     * be displayed and printing will begin immediately on the event-dispatch
     * thread. This blocks any other events, including repaints, from being
     * processed until printing is complete. Although this effectively prevents
     * the table from being changed, it doesn't provide a good user experience.
     * For this reason, specifying <code>false</code> is only recommended when
     * printing from an application with no visible GUI.
     * <p>
     * Note: Attempting to show the printing dialog or run interactively, while
     * in headless mode, will result in a <code>HeadlessException</code>.
     * <p>
     * Before fetching the printable, this method prepares the table in order
     * to get the most desirable printed result. If the table is currently
     * in an editing mode, it terminates the editing as gracefully as
     * possible. It also ensures that the table's current selection and
     * focused cell are not indicated in the printed output. This is handled on
     * the view level, and only for the duration of the printing, thus no
     * notification needs to be sent to the selection models.
     * <p>
     * See {@link #getPrintable} for further description on how the
     * table is printed.
     *
     * @param  printMode        the printing mode that the printable should use
     * @param  headerFormat     a <code>MessageFormat</code> specifying the text
     *                          to be used in printing a header,
     *                          or null for none
     * @param  footerFormat     a <code>MessageFormat</code> specifying the text
     *                          to be used in printing a footer,
     *                          or null for none
     * @param  showPrintDialog  whether or not to display a print dialog
     * @param  attr             a <code>PrintRequestAttributeSet</code>
     *                          specifying any printing attributes,
     *                          or null for none
     * @param  interactive      whether or not to print in an interactive mode
     * @return true, unless printing is cancelled by the user
     * @throws PrinterException if an error in the print system causes the job
     *                          to be aborted
     * @throws HeadlessException if the method is asked to show a printing
     *                           dialog or run interactively, and
     *                           <code>GraphicsEnvironment.isHeadless</code>
     *                           returns true
     * @see #getPrintable
     * @see java.awt.GraphicsEnvironment#isHeadless
     *
     * @since 1.5
     */
    public boolean print(PrintMode printMode,
                         MessageFormat headerFormat,
                         MessageFormat footerFormat,
                         boolean showPrintDialog,
                         PrintRequestAttributeSet attr,
                         boolean interactive) throws PrinterException,
                                                     HeadlessException;
    /**
     * Return a <code>Printable</code> for use in printing this JTable.
     * <p>
     * The <code>Printable</code> can be requested in one of two printing modes.
     * In both modes, it spreads table rows naturally in sequence across
     * multiple pages, fitting as many rows as possible per page.
     * <code>PrintMode.NORMAL</code> specifies that the table be
     * printed at its current size. In this mode, there may be a need to spread
     * columns across pages in a similar manner to that of the rows. When the
     * need arises, columns are distributed in an order consistent with the
     * table's <code>ComponentOrientation</code>.
     * <code>PrintMode.FIT_WIDTH</code> specifies that the output be
     * scaled smaller, if necessary, to fit the table's entire width
     * (and thereby all columns) on each page. Width and height are scaled
     * equally, maintaining the aspect ratio of the output.
     * <p>
     * The <code>Printable</code> heads the portion of table on each page
     * with the appropriate section from the table's <code>JTableHeader</code>,
     * if it has one.
     * <p>
     * Header and footer text can be added to the output by providing
     * <code>MessageFormat</code> arguments. The printing code requests
     * Strings from the formats, providing a single item which may be included
     * in the formatted string: an <code>Integer</code> representing the current
     * page number.
     * <p>
     * You are encouraged to read the documentation for
     * <code>MessageFormat</code> as some characters, such as single-quote,
     * are special and need to be escaped.
     * <p>
     * Here's an example of creating a <code>MessageFormat</code> that can be
     * used to print "Duke's Table: Page - " and the current page number:
     * <p>
     * <pre>
     *     // notice the escaping of the single quote
     *     // notice how the page number is included with "{0}"
     *     MessageFormat format = new MessageFormat("Duke''s Table: Page - {0}");
     * </pre>
     * <p>
     * The <code>Printable</code> constrains what it draws to the printable
     * area of each page that it prints. Under certain circumstances, it may
     * find it impossible to fit all of a page's content into that area. In
     * these cases the output may be clipped, but the implementation
     * makes an effort to do something reasonable. Here are a few situations
     * where this is known to occur, and how they may be handled by this
     * particular implementation:
     * <ul>
     *   <li>In any mode, when the header or footer text is too wide to fit
     *       completely in the printable area -- print as much of the text as
     *       possible starting from the beginning, as determined by the table's
     *       <code>ComponentOrientation</code>.
     *   <li>In any mode, when a row is too tall to fit in the
     *       printable area -- print the upper-most portion of the row
     *       and paint no lower border on the table.
     *   <li>In <code>PrintMode.NORMAL</code> when a column
     *       is too wide to fit in the printable area -- print the center
     *       portion of the column and leave the left and right borders
     *       off the table.
     * </ul>
     * <p>
     * It is entirely valid for this <code>Printable</code> to be wrapped
     * inside another in order to create complex reports and documents. You may
     * even request that different pages be rendered into different sized
     * printable areas. The implementation must be prepared to handle this
     * (possibly by doing its layout calculations on the fly). However,
     * providing different heights to each page will likely not work well
     * with <code>PrintMode.NORMAL</code> when it has to spread columns
     * across pages.
     * <p>
     * It is important to note that this <code>Printable</code> prints the
     * table at its current visual state, using the table's existing renderers.
     * <i>Before</i> calling this method, you may wish to <i>first</i> modify
     * the state of the table (such as to change the renderers, cancel editing,
     * or hide the selection).
     * <p>
     * You must not, however, modify the table in any way <i>after</i>
     * this <code>Printable</code> is fetched (invalid modifications include
     * changes in: size, renderers, or underlying data). The behavior of the
     * returned <code>Printable</code> is undefined once the table has been
     * changed.
     * <p>
     * Here's a simple example that calls this method to fetch a
     * <code>Printable</code>, shows a cross-platform print dialog, and then
     * prints the <code>Printable</code> unless the user cancels the dialog:
     * <p>
     * <pre>
     *     // prepare the table for printing here first (for example, hide selection)
     *
     *     // wrap in a try/finally so table can be restored even if something fails
     *     try {
     *         // fetch the printable
     *         Printable printable = table.getPrintable(JTable.PrintMode.FIT_WIDTH,
     *                                                  new MessageFormat("My Table"),
     *                                                  new MessageFormat("Page - {0}"));
     *
     *         // fetch a PrinterJob
     *         PrinterJob job = PrinterJob.getPrinterJob();
     *
     *         // set the Printable on the PrinterJob
     *         job.setPrintable(printable);
     *
     *         // create an attribute set to store attributes from the print dialog
     *         PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
     *
     *         // display a print dialog and record whether or not the user cancels it
     *         boolean printAccepted = job.printDialog(attr);
     *
     *         // if the user didn't cancel the dialog
     *         if (printAccepted) {
     *             // do the printing (may need to handle PrinterException)
     *             job.print(attr);
     *         }
     *     } finally {
     *         // restore the original table state here (for example, restore selection)
     *     }
     * </pre>
     *
     * @param  printMode     the printing mode that the printable should use
     * @param  headerFormat  a <code>MessageFormat</code> specifying the text to
     *                       be used in printing a header, or null for none
     * @param  footerFormat  a <code>MessageFormat</code> specifying the text to
     *                       be used in printing a footer, or null for none
     * @return a <code>Printable</code> for printing this JTable
     * @see Printable
     * @see PrinterJob
     *
     * @since 1.5
     */
    public Printable getPrintable(PrintMode printMode,
                                  MessageFormat headerFormat,
                                  MessageFormat footerFormat);

Изменения к текстовым классам Swing

4201999: JTextArea автоматически не прокручивает, добавляя () им.

Описание:

Некоторые из текстовых компонентных методов Swing ориентированы на многопотоковое исполнение; особенно те, которые изменяют контент текстового компонента. До 5.0 было бы только обновлено расположение каре, если модификация происходит на потоке диспетчеризации события. В определенных ситуациях это является требуемым, чтобы обновить расположение независимо от того, на каком потоке модификация происходит. Чтобы разместить это updatePolicy свойство было добавлено к DefaultCaret. Это свойство позволяет разработчику определять, когда расположение должно измениться, когда контент изменяется. Для обратной совместимости политика состоит в том, чтобы все еще только обновить расположение, если модификация происходит на потоке диспетчеризации события.

Результаты в следующих полях и методах, добавляемых к DefaultCaret.

     /**
      * Indicates that the caret position is to be updated only when
      * document changes are performed on the Event Dispatching Thread.
      * @see #setUpdatePolicy
      * @see #getUpdatePolicy
      * @since 1.5
      */
     public static final int UPDATE_WHEN_ON_EDT = 0;
 
     /**
      * Indicates that the caret should remain at the same
      * absolute position in the document regardless of any document
      * updates, except when the document length becomes less than
      * the current caret position due to removal. In that case the caret
      * position is adjusted to the end of the document.
      *
      * @see #setUpdatePolicy
      * @see #getUpdatePolicy
      * @since 1.5
      */
     public static final int NEVER_UPDATE = 1;
 
     /**
      * Indicates that the caret position is to be <b>always</b>
      * updated accordingly to the document changes regardless whether
      * the document updates are performed on the Event Dispatching Thread
      * or not.
      *
      * @see #setUpdatePolicy
      * @see #getUpdatePolicy
      * @since 1.5
      */
     public static final int ALWAYS_UPDATE = 2;
 
     /**
      * Sets the caret movement policy on the document updates. Normally
      * the caret updates its absolute position within the document on
      * insertions occurred before or at the caret position and
      * on removals before the caret position. 'Absolute position'
      * means here the position relative to the start of the document.
      * For example if
      * a character is typed within editable text component it is inserted
      * at the caret position and the caret moves to the next absolute
      * position within the document due to insertion and if
      * <code>BACKSPACE</code> is typed then caret decreases its absolute
      * position due to removal of a character before it. Sometimes
      * it may be useful to turn off the caret position updates so that
      * the caret stays at the same absolute position within the
      * document position regardless of any document updates.
      * <p>
      * The following update policies are allowed:
      * <ul>
      *   <li><code>NEVER_UPDATE</code>: the caret stays at the same
      *       absolute position in the document regardless of any document
      *       updates, except when document length becomes less than
      *       the current caret position due to removal. In that case caret
      *       position is adjusted to the end of the document.
      *       The caret doesn't try to keep itself visible by scrolling
      *       the associated view when using this policy. </li>
      *   <li><code>ALWAYS_UPDATE</code>: the caret always tracks document
      *       changes. For regular changes it increases its position
      *       if an insertion occurs before or at its current position,
      *       and decreases position if a removal occurs before
      *       its current position. For undo/redo updates it is always
      *       moved to the position where update occurred. The caret
      *       also tries to keep itself visible by calling
      *       <code>adjustVisibility</code> method.</li>
      *   <li><code>UPDATE_WHEN_ON_EDT</code>: acts like <code>ALWAYS_UPDATE</code>
      *       if the document updates are performed on the Event Dispatching Thread
      *       and like <code>NEVER_UPDATE</code> if updates are performed on
      *       other thread. </li>
      * </ul> <p>
      * The default property value is <code>UPDATE_WHEN_ON_EDT</code>.
      *
      * @param policy one of the following values : <code>UPDATE_WHEN_ON_EDT</code>,
      * <code>NEVER_UPDATE</code>, <code>ALWAYS_UPDATE</code>
      * @throws IllegalArgumentException if invalid value is passed
      *
      * @see #getUpdatePolicy
      * @see #adjustVisibility
      * @see #UPDATE_WHEN_ON_EDT
      * @see #NEVER_UPDATE
      * @see #ALWAYS_UPDATE
      *
      * @since 1.5
      */
     public void setUpdatePolicy(int policy)
 
     /**
      * Gets the caret movement policy on document updates.
      *
      * @return one of the following values : <code>UPDATE_WHEN_ON_EDT</code>,
      * <code>NEVER_UPDATE</code>, <code>ALWAYS_UPDATE</code>
      *
      * @see #getUpdatePolicy
      * @see #UPDATE_WHEN_ON_EDT
      * @see #NEVER_UPDATE
      * @see #ALWAYS_UPDATE
      *
      * @since 1.5
      */
     public int getUpdatePolicy()
 

4473401: Формы должны генерировать событие гиперссылки, не непосредственно отправить/получить данные

Описание:

JEditorPane может использоваться, чтобы вывести на экран текст HTML. Когда пользователь щелкает по ссылке, событие сгенерировано разрешение разработчика настроить то, что произойдет. В настоящий момент, если у страницы HTML есть формы в ней, и пользователь инициировал представление, сообщение происходит автоматически, не разрешая разработчику изменить поведение. Чтобы позволить разработчикам настраивать поведение, следующие методы были добавлены к HTMLEditorKit:

    /**
     * Indicates whether an html form submission is processed automatically
     * or only <code>FormSubmitEvent</code> is fired.
     *
     * @return true  if html form submission is processed automatically,
     *         false otherwise.
     *
     * @see #setAutoFormSubmission
     * @since 1.5
     */
    public boolean isAutoFormSubmission();

    /**
     * Specifies if an html form submission is processed
     * automatically or only <code>FormSubmitEvent</code> is fired.
     * By default it the property is set to true.
     *
     * @see #isAutoFormSubmission
     * @see FormSubmitEvent
     * @since 1.5
     */
    public void setAutoFormSubmission(boolean isAuto);

Ключевая роль этой работы делала класс FormSubmitEvent общественность, обратитесь к 4954126 для деталей об этом.

4513720: Видимость DefaultCaret должна быть отдельной от мигания

Описание:

Нет в настоящий момент никакого способа определить если каре в активном и мигающем. isVisible метод был предназначен с этой целью, но возвраты реализации, красится ли каре, в настоящее время это вызывается, то есть если каре мигает isVisible изменения между истиной и ложью как каре мигают. Поддержать обратную совместимость интерпретация isVisible методу оставили то же самое, и isActive свойство было добавлено, который говорит, является ли каре активным, но не обязательно видимым в то время, когда метод вызывается.

Следующие методы были добавлены к DefaultCaret:

    /**
     * Determines if the caret is currently active.
     * <p>
     * This method returns whether or not the <code>Caret</code>
     * is currently in a blinking state. It does not provide
     * information as to whether it is currently blinked on or off.
     * To determine if the caret is currently painted use the
     * <code>isVisible</code> method.
     *
     * @return <code>true</code> if active else <code>false</code>
     * @see #isVisible
     *
     * @since 1.5
     */
    public boolean isActive()


     * Sets the caret visibility, and repaints the caret.
     * It is important to understand the relationship between this method,
     * <code>isVisible</code> and <code>isActive</code>.
     * Calling this method with a value of <code>true</code> activates the
     * caret blinking. Setting it to <code>false</code> turns it completely off.
     * To determine whether the blinking is active, you should call
     * <code>isActive</code>. In effect, <code>isActive</code> is an
     * appropriate corresponding "getter" method for this one.
     * <code>isVisible</code> can be used to fetch the current
     * visibility status of the caret, meaning whether or not it is currently
     * painted. This status will change as the caret blinks on and off.
     * <p>
     * Here's a list showing the potential return values of both
     * <code>isActive</code> and <code>isVisible</code>
     * after calling this method:
     * <p>
     * <b><code>setVisible(true)</code></b>:
     * <ul>
     *     <li>isActive(): true</li>
     *     <li>isVisible(): true or false depending on whether
     *         or not the caret is blinked on or off</li>
     * </ul>
     * <p>
     * <b><code>setVisible(false)</code></b>:
     * <ul>
     *     <li>isActive(): false</li>
     *     <li>isVisible(): false</li>
     * </ul>
     *
     * @param e the visibility specifier
     * @see #isActive
     * @see Caret#setVisible
     */
    public void setVisible(boolean e)

Документация для isVisible метода DefaultCaret была обновлена, чтобы указать на различие между этими двумя свойствами:

    /**
     * Indicates whether or not the caret is currently visible. As the
     * caret flashes on and off the return value of this will change
     * between true, when the caret is painted, and false, when the
     * caret is not painted. <code>isActive</code> indicates whether
     * or not the caret is in a blinking state, such that it <b>can</b>
     * be visible, and <code>isVisible</code> indicates whether or not
     * the caret <b>is</b> actually visible.
     * <p>
     * Subclasses that wish to render a different flashing caret
     * should override paint and only paint the caret if this method
     * returns true.
     *
     * @return true if visible else false
     * @see Caret#isVisible
     * @see #isActive
     */
    public boolean isVisible()

4530474: CSS цвета фона приписывает в работах тега шрифта HTML в стиле, но не классе

Описание:

Фоновый атрибут из css таблицы стилей игнорируется, представляя текст HTML. Чтобы заставить это работать, мы добавили следующий метод к LabelView:

    /**
     * Sets the background color for the view. This method is typically
     * invoked as part of configuring this <code>View</code>. If you need
     * to customize the background color you should override
     * <code>setPropertiesFromAttributes</code> and invoke this method. A
     * value of null indicates no background should be rendered, so that the
     * background of the parent <code>View</code> will show through.
     *
     * @param bg background color, or null
     * @see #setPropertiesFromAttributes
     * @since 1.5
     */
    protected void setBackground(Color bg);

4829622: Класс TabSet не переопределяет, равняется

Описание:

TabSet не переопределяет equals метод, который заставляет сравнения перестать работать если TabStop массив действительно содержит то же самое TabStops. Это вызывает AttributeSet не быть равным, даже при том, что единственной разницей является другой объектный экземпляр TabSet.

TabSet теперь переопределит equals и hashCode:

/**
* Indicates whether this <code>TabSet</code> is equal to another one.
* @param o the <code>TabSet</code> instance which this instance
* should be compared to.
* @return <code>true</code> if <code>o</code> is the instance of
* <code>TabSet</code>, has the same number of <code>TabStop</code>s
* and they are all equal, <code>false</code> otherwise.
*
* @since 1.5
*/
public boolean equals(Object o)

/**
* Returns a hashcode for this set of TabStops.
* @return a hashcode value for this set of TabStops.
*
* @since 1.5
*/
public int hashCode()

4838730: РЕГРЕСС: В JTextArea setEditable (...) повреждает ключи обхода фокуса

Описание:

Вызов JTextArea.setEditable сбрасывает ключи обхода фокуса. Это - problmatic для разработчиков, которые хотят обеспечить пользовательский набор ключей обхода фокуса и условно изменить доступное для редактирования свойство.

Фиксировать это JComponent теперь переопределяет следующее:

    /**
     * Sets the focus traversal keys for a given traversal operation for this
     * Component.
     * Refer to
     * {@link java.awt.Component#setFocusTraversalKeys}
     * for a complete description of this method.
     *
     * @param id one of KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
     *        KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, or
     *        KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS
     * @param keystrokes the Set of AWTKeyStroke for the specified operation
     * @see java.awt.KeyboardFocusManager#FORWARD_TRAVERSAL_KEYS
     * @see java.awt.KeyboardFocusManager#BACKWARD_TRAVERSAL_KEYS
     * @see java.awt.KeyboardFocusManager#UP_CYCLE_TRAVERSAL_KEYS
     * @throws IllegalArgumentException if id is not one of
     *         KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
     *         KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, or
     *         KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS, or if keystrokes
     *         contains null, or if any Object in keystrokes is not an
     *         AWTKeyStroke, or if any keystroke represents a KEY_TYPED event,
     *         or if any keystroke already maps to another focus traversal
     *         operation for this Component
     * @since 1.5
     * @beaninfo
     *       bound: true
     */
    public void setFocusTraversalKeys(int id, Set keystrokes);

4954126: Обнародуйте класс FormSubmitEvent и его методы средства доступа

Описание:

Согласно просьбе FormSubmitEvent не общедоступен.

Разные Изменения Swing

4198834: ListDataEvent.getIndex0 () должен быть <= getIndex1 ()

Описание:

Конструктор ListDataEvent был изменен, чтобы подкачать эти два индекса, это передают так, чтобы возвращаемое значение от getIndex0 () всегда было <= возвращаемым значением от getIndex1.

Спецификация

   /**
    * Constructs a ListDataEvent object. If index0 is >
    * index1, index0 and index1 will be swapped such that
    * index0 will always be <= index1.
    *
    * @param source  the source Object (typically <code>this</code>)
    * @param type    an int specifying {@link #CONTENTS_CHANGED},
    *                {@link #INTERVAL_ADDED}, or {@link #INTERVAL_REMOVED}
    * @param index0  one end of the new interval
    * @param index1  the other end of the new interval
    */
public ListDataEvent(Object source, int type, int index0, int index1) {

4303294: Реализуйте прерывистый выбор от клавиатуры для подобных списку компонентов

Описание:

JTable и JList в настоящий момент не обеспечивают способа сделать прерывистые выборы, используя клавиатуру. Чтобы включить этому, следующее было добавлено к DefaultListSelectionModel:

/**
 * Set the lead selection index, leaving all selection values unchanged.
 * If leadAnchorNotificationEnabled is true, send a notification covering
 * the old and new lead cells.
 *
 * @param leadIndex the new lead selection index
 *
 * @see #setAnchorSelectionIndex
 * @see #setLeadSelectionIndex
 * @see #getLeadSelectionIndex
 *
 * @since 1.5
 */
public void moveLeadSelectionIndex(int leadIndex)

Дополнительно isLeadAnchorNotificationEnabled DefaultListSelectionModel и changeSelection методы были пересмотрены.

4621323: Некоторые константы колебания не являются постоянными.

Описание:

Следующие статические поля являются теперь статическим финалом: JDesktopPane. LIVE_DRAG_MODE, JDesktopPane. OUTLINE_DRAG_MODE и ДАТА FILE_VERSION.

4664885: Теневые цвета подкачиваются в зависимости от того, повышается ли BevelBorder/понижается

Описание:

Границы скоса обмениваются их shadowInner и shadowOuter цвета в зависимости от того, повышаются ли они или понижаются. Однако, BorderFactory и BevelBorder не говорят это - это пишется для повышенной границы скоса только. Это привело к добавлению следующего конструктору BevelBorder и createBevelBorder методу BorderFactory:

     * Note: The shadow inner and outer colors are
     * switched for a lowered bevel border.

4665148: javadoc для javax.swing. JScrollPane.isValidateRoot является полностью неправильным

Описание:

Javadoc для JScrollPane.isValidateRoot является полностью неправым и вводящим в заблуждение и был изменен на:
    /**
     * Overridden to return true so that any calls to <code>revalidate</code>
     * on any descendants of this <code>JScrollPane</code> will cause the
     * entire tree beginning with this <code>JScrollPane</code> to be
     * validated.
     *
     * @return true
     * @see java.awt.Container#validate
     * @see JComponent#revalidate
     * @see JComponent#isValidateRoot
     *
     * @beaninfo
     *    hidden: true
     */

4682386: Перефакторинг SwingPropertyChangeSupport и PropertyChangeSupport

Описание:

Класс PropertyChangeSupport является утилитой, которая облегчает регистрировать и увольнять PropertyChangeEvents - который является уведомлением, что свойство JavaBean было изменено. SwingPropertyChangeSupport является подклассом PropertyChangeSupport и имеет много избыточных методов. Кроме того, в 1.2 периода времени, поддержка изменений свойства была добавлена к Компоненту. Вместо того, чтобы представлять зависимость от SwingPropertyChangeSupport, Component использование PropertyChangeSupport. JComponent поддерживает экземпляр SwingPropertyChangeSupport и Component поддерживает экземпляр PropertyChangeSupport. Результаты - каждый JComponent наличие двух экземпляров PropertyChangeSupport - один из которых является бездействующим. Сокращать перекрытие между Component и JComponent так же как PropertyChangeSupport и SwingPropertyChangeSupport следующие изменения были произведены:

Продвиньте следующие методы от JComponent к Component:

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a byte)
     * @param newValue the new value of the property (as a byte)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
    public void firePropertyChange(String propertyName, byte oldValue, byte newValue);

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a char)
     * @param newValue the new value of the property (as a char)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
     public void firePropertyChange(String propertyName, char oldValue, char newValue);

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a short)
     * @param newValue the old value of the property (as a short)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
    public void firePropertyChange(String propertyName, short oldValue, short newValue);

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a long)
     * @param newValue the new value of the property (as a long)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
    public void firePropertyChange(String propertyName, long oldValue, long newValue);

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a float)
     * @param newValue the new value of the property (as a float)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
    public void firePropertyChange(String propertyName, float oldValue, float newValue);

    /**
     * Reports a bound property change.
     *
     * @param propertyName the programmatic name of the property
     *               that was changed
     * @param oldValue the old value of the property (as a double)
     * @param newValue the new value of the property (as a double)
     * @see #firePropertyChange(java.lang.String, java.lang.Object,
     *               java.lang.Object)
     * @since 1.5
     */
    public void firePropertyChange(String propertyName, double oldValue, double newValue);

Соответствующие методы в JComponent были удалены.

Все методы от SwingPropertyChangeSupport были удалены, только конструктор остается.

4706356: CellRenderers Swing по умолчанию должен переопределить больше методов для улучшенного перфекта

Описание:

Ячейка Swing rendenders переопределяет горстку методов, чтобы ничего не сделать, поскольку они не необходимы для средств рендеринга ячейки. Они должны переопределить несколько методов, которые теперь вызывают, чтобы ничего не сделать.

Следующие методы были добавлены к DefaultTableCellRenderer, DefaultListCellRenderer и DefaultTreeCellRenderer

    /**
     * Overridden for performance reasons.
     * See the <a href="#override">Implementation Note</a>
     * for more information.
     *
     * @since 1.5
     */
    public void invalidate();
    /**
     * Overridden for performance reasons.
     * See the <a href="#override">Implementation Note</a>
     * for more information.
     *
     * @since 1.5
     */
    public void repaint();

4716935: Вызов JLayeredPane.removeAll может привести к утечке

Описание:

JLayeredPane поддерживает a HashTable из Components это содержит. Это в настоящий момент не переопределяет removeAll обновить HashTable, получающийся в возможной утечке. JLayeredPane теперь переопределит removeAll сделать необходимую уборку:

    /** 
     * Removes all the components from this container.
     *
     * @since 1.5
     */
    public void removeAll();

4717180: Swing должен задокументировать это, UIs может изменить визуальные свойства когда установлено

Описание:

Классы Swing документируют значение по умолчанию многих свойств. Пользовательский взгляд и чувства могут изменить эти значения так, чтобы казалось, что значение по умолчанию не допустимо, это должно быть разъяснено. Чтобы задокументировать это, следующее было добавлено к уровню класса JCOMPONENT javadoc:

     * <code>JComponent</code> and its subclasses document default values
     * for certain properties.  For example, <code>JTable</code> documents the
     * default row height as 16.  Each <code>JComponent</code> subclass
     * that has a <code>ComponentUI</code> will create the
     * <code>ComponentUI</code> as part of its constructor.  In order
     * to provide a particular look and feel each
     * <code>ComponentUI</code> may set properties back on the
     * <code>JComponent</code> that created it.  For example, a custom
     * look and feel may require <code>JTable</code>s to have a row
     * height of 24. The documented defaults are the value of a property
     * BEFORE the <code>ComponentUI</code> has been installed.  If you
     * need a specific value for a particular property you should
     * explicitly set it.

4723745: Классы Metal & Windows FileChooserUI не могут использоваться без ShellFolder

Описание:

С тех пор 1.4, у кода JFileChooser есть слишком сильная зависимость от собственного уровня. Попытка была предпринята, чтобы обойти этот класс для программ, которые используют специализированную "виртуальную" файловую систему, но алгоритм не на 100 % надежен. Чтобы переключить это поведение, используйте клиентское свойство FileChooser.useShellFolder, например, чтобы выключить использование собственного набора это к false:

    jFileChooser.putClientProperty("FileChooser.useShellFolder", Boolean.FALSE);

4749723: Spring и SpringLayout нуждаются в некоторой непринужденности методов методов

Описание:

В настоящий момент довольно трудно создать некоторые общие разметки с SpringLayout. Разработчики запросили пару методов облегчить создавать общие разметки с SpringLayout, так же как облегчать сохранять SpringLayout.

Следующее было добавлено к Spring:

    /**
     * Returns a spring whose <em>minimum</em>, <em>preferred</em>, <em>maximum</em>
     * and <em>value</em> properties are each multiples of the properties of the
     * argument spring, <code>s</code>. Minimum and maximum properties are
     * swapped when <code>factor</code> is negative (in accordance with the
     * rules of interval arithmetic).
     * <p>
     * When factor is, for example, 0.5f the result represents 'the mid-point'
     * of its input - an operation that is useful for centering components in
     * a container.
     *
     * @param s the spring to scale
     * @param factor amount to scale by.
     * @return  a spring whose properties are those of the input spring <code>s</code>
     * multiplied by <code>factor</code>
     * @throws NullPointerException if <code>s</code> is null
     * @since 1.5
     */
    public static Spring scale(Spring s, float factor);

    /**
     * Returns a spring whose <em>minimum</em>, <em>preferred</em>, <em>maximum</em>
     * and <em>value</em> properties are defined by the widths of the <em>minimumSize</em>,
     * <em>preferredSize</em>, <em>maximumSize</em> and <em>size</em> properties
     * of the supplied component. The returned spring is a 'wrapper' implementation
     * whose methods call the appropriate size methods of the supplied component.
     * The minimum, preferred, maximum and value properties of the returned spring
     * therefore report the current state of the appropriate properties in the
     * component and track them as they change.
     *
     * @param c Component used for calculating size
     * @return  a spring whose properties are defined by the horizontal component
     * of the component's size methods.
     * @throws NullPointerException if <code>c</code> is null
     * @since 1.5
     */
    public static Spring width(Component c);

    /**
     * Returns a spring whose <em>minimum</em>, <em>preferred</em>, <em>maximum</em>
     * and <em>value</em> properties are defined by the heights of the <em>minimumSize</em>,
     * <em>preferredSize</em>, <em>maximumSize</em> and <em>size</em> properties
     * of the supplied component. The returned spring is a 'wrapper' implementation
     * whose methods call the appropriate size methods of the supplied component.
     * The minimum, preferred, maximum and value properties of the returned spring
     * therefore report the current state of the appropriate properties in the
     * component and track them as they change.
     *
     * @param c Component used for calculating size
     * @return  a spring whose properties are defined by the vertical component
     * of the component's size methods.
     * @throws NullPointerException if <code>c</code> is null
     * @since 1.5
     */
    public static Spring height(Component c);

И следующее было добавлено к SpringLayout. Ограничения:

        /**
         * Creates a <code>Constraints</code> object with
         * suitable <code>x</code>, <code>y</code>, <code>width</code> and
         * <code>height</code> springs for component, <code>c</code>.
         * The <code>x</code> and <code>y</code> springs are constant
         * springs  initialised with the component's location at
         * the time this method is called. The <code>width</code> and
         * <code>height</code> springs are special springs, created by
         * the <code>Spring.width()</code> and <code>Spring.height()</code>
         * methods, which track the size characteristics of the component
         * when they change.
         *
         * @param c  the component whose characteristics will be reflected by this Constraints object
         * @throws NullPointerException if <code>c</code> is null.
         * @since 1.5
         */
        public Constraints(Component c);

4753342: Высокоуровневый компонент Swing должен перенаправить, добавляют/удаляют методы к ContentPane

Описание:

Вопреки программированию AWT, JFrame/JDialg/JWindow/JApplet/JInternalFrame не позволяют Вам добавлять Components к этому, вместо этого следует узнать JRootPane и добавьте Компоненты дочерних элементов к этому. Это добавляет бесполезный беспорядок к новым разработчикам.

До 5.0, пытаясь добавить или удалить a Component от одного из них верхний уровень Components привел бы к исключению быть брошенным. В 5.0, никакое исключение не будет выдано, вместо этого Component будет добавлен или удален из области контента. Это привело к нескольким версиям javadoc JFrame, JDialog, JWindow, JApplet и JInternalFrame. Это было получено в итоге в javadoc RootPaneContainer:

     * For conveniance
     * <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>,
     * <code>JApplet</code> and <code>JInternalFrame</code>, by default,
     * forward all calls to <code>add</code> and its variants,
     * <code>remove</code> and <code>setLayout</code> to the
     * <code>contentPane</code>. This means rather than writing:
     * <pre>
     * rootPaneContainer.getContentPane().add(component);
     * </pre>
     * you can do:
     * <pre>
     * rootPaneContainer.add(component);
     * </pre>
     * <p>
     * The behavior of <code>add</code> and its variants and
     * <code>setLayout</code> for
     * <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>,
     * <code>JApplet</code> and <code>JInternalFrame</code> is controlled by
     * the <code>rootPaneCheckingEnabled</code> property. If this property is
     * true, the default, then <code>add</code> and its variants and
     * <code>setLayout</code> are
     * forwarded to the <code>contentPane</code>, if it is false, then these
     * methods operate directly on the <code>RootPaneContainer</code>. This
     * property is only intended for subclasses, and is therefor protected.

4789491: JFileChooser не говорит, как выбрать каталоги

Описание:

Документация для JFileChooser не является четкой на том, где сказать селектору файла, должны ли файлы, каталоги или оба быть выбраны. Это привело к пересмотру документации для следующих методов:

    /**
     * Adds a filter to the list of user choosable file filters.
     * For information on setting the file selection mode, see
     * {@link #setFileSelectionMode setFileSelectionMode}.
     *
     * @param filter the <code>FileFilter</code> to add to the choosable file
     *               filter list
     *
     * @beaninfo
     *   preferred: true
     *       bound: true
     * description: Adds a filter to the list of user choosable file filters.
     *
     * @see #getChoosableFileFilters
     * @see #removeChoosableFileFilter
     * @see #resetChoosableFileFilters
     * @see #setFileSelectionMode
     */
    public void addChoosableFileFilter(FileFilter filter);

    /**
     * Sets the <code>JFileChooser</code> to allow the user to just
     * select files, just select
     * directories, or select both files and directories.  The default is
     * <code>JFilesChooser.FILES_ONLY</code>.
     *
     * @param mode the type of files to be displayed:
     * <ul>
     * <li>JFileChooser.FILES_ONLY
     * <li>JFileChooser.DIRECTORIES_ONLY
     * <li>JFileChooser.FILES_AND_DIRECTORIES
     * </ul>
     *
     * @exception IllegalArgumentException  if <code>mode</code> is an
     *                          illegal file selection mode
     * @beaninfo
     *   preferred: true
     *       bound: true
     * description: Sets the types of files that the JFileChooser can choose.
     *        enum: FILES_ONLY JFileChooser.FILES_ONLY
     *              DIRECTORIES_ONLY JFileChooser.DIRECTORIES_ONLY
     *              FILES_AND_DIRECTORIES JFileChooser.FILES_AND_DIRECTORIES
     *
     *
     * @see #getFileSelectionMode
     */
    public void setFileSelectionMode(int mode);

4831322: JDesktopPane.setDesktopManager должен обновить среду рабочего стола в UI.

Описание:

Вызов, который не берет JDesktopPane.setDesktopManager, влияет, пока UI не перезагружается.

Фиксировать этот BasicDesktopPaneUI не будет переопределять следующие методы:

    /**
     * Installs the <code>PropertyChangeListener</code> returned from
     * <code>createPropertyChangeListener</code> on the <code>JDesktopPane</code>.
     *
     * @since 1.5
     * @see #createPropertyChangeListener
     */
    protected void installListeners()
    
    /**
     * Uninstalls the <code>PropertyChangeListener</code> returned from
     * <code>createPropertyChangeListener</code> from the <code>JDesktopPane</code>.
     *
     * @since 1.5
     * @see #createPropertyChangeListener
     */
    protected void uninstallListeners()
    
    /*
     * Returns the <code>PropertyChangeListener</code> to install on
     * the <code>JDesktopPane</code>.
     *
     * @since 1.5
     * @return The PropertyChangeListener that will be added to track
     * changes in the desktop pane.
     */
    protected PropertyChangeListener createPropertyChangeListener()

4864304: Улучшите потребление памяти приложений Swing

Описание:

Чтобы сократить на размер экземпляра различных подклассов JComponent, следующие изменения были произведены.

Избегать двойного хранения привилегированного, минимального и максимального размера JComponent's следующие методы были продвинуты на Component:

    /**
     * Sets the preferred size of this component to a constant
     * value.  Subsequent calls to <code>getPreferredSize</code> will always
     * return this value.  Setting the preferred size to <code>null</code>
     * restores the default behavior.
     *
     * @param preferredSize The new preferred size, or null
     * @see #getPreferredSize
     * @see #isPreferredSizeSet
     * @since 1.5
     */
    public void setPreferredSize(Dimension preferredSize);

    /**
     * Returns true if the preferred size has been set to a
     * non-<code>null</code> value otherwise returns false.
     *
     * @return true if <code>setPreferredSize</code> has been invoked
     *         with a non-null value.
     * @since 1.5
     */ 
    public boolean isPreferredSizeSet();

    /**
     * Sets the minimum size of this component to a constant
     * value.  Subsequent calls to <code>getMinimumSize</code> will always
     * return this value.  Setting the minimum size to <code>null</code>
     * restores the default behavior.
     *
     * @param minimumSize the new minimum size of this component
     * @see #getMinimumSize
     * @see #isMinimumSizeSet
     * @since 1.5
     */
    public void setMinimumSize(Dimension minimumSize);

    /**
     * Returns whether or not <code>setMinimumSize</code> has been
     * invoked with a non-null value.
     *
     * @return true if <code>setMinimumSize</code> has been invoked with a
     *              non-null value.
     * @since 1.5
     */
    public boolean isMinimumSizeSet();

    /**
     * Sets the maximum size of this component to a constant
     * value.  Subsequent calls to <code>getMaximumSize</code> will always
     * return this value.  Setting the maximum size to <code>null</code>
     * restores the default behavior.
     *
     * @param maximumSize a <code>Dimension</code> containing the 
     *               desired maximum allowable size
     * @see #getMaximumSize
     * @see #isMaximumSizeSet
     * @since 1.5
     */
    public void setMaximumSize(Dimension maximumSize);

    /**
     * Returns true if the maximum size has been set to a non-<code>null</code>
     * value otherwise returns false.
     *
     * @return true if <code>maximumSize</code> is non-<code>null</code>,
     *               false otherwise
     * @since 1.5
     */ 
    public boolean isMaximumSizeSet();

Улучшить память, необходимую для того, чтобы автопрокрутить JComponent теперь переопределит следующий метод:

    /**
     * Processes mouse events occurring on this component by
     * dispatching them to any registered
     * <code>MouseListener</code> objects, refer to
     * {@link java.awt.Component#processMouseEvent(MouseEvent)}
     * for a complete description of this method.
     *
     * @param       e the mouse event
     * @see         java.awt.Component#processMouseEvent
     * @since 1.5
     */
    protected void processMouseEvent(MouseEvent e);

Уменьшать размер AbstractButton's следующие методы будет overriden:

    /**
     * Adds the specified component to this container at the specified
     * index, refer to
     * {@link java.awt.Container#addImpl(Component, Object, int)}
     * for a complete description of this method.
     *
     * @param     comp the component to be added
     * @param     constraints an object expressing layout constraints 
     *                 for this component
     * @param     index the position in the container's list at which to
     *                 insert the component, where <code>-1</code> 
     *                 means append to the end
     * @exception IllegalArgumentException if <code>index</code> is invalid
     * @exception IllegalArgumentException if adding the container's parent
     *                  to itself
     * @exception IllegalArgumentException if adding a window to a container
     * @since 1.5
     */
    protected void addImpl(Component comp, Object constraints, int index);

    /** 
     * Sets the layout manager for this container, refer to
     * {@link java.awt.Container#setLayout(LayoutManager)}
     * for a complete description of this method.
     *
     * @param mgr the specified layout manager
     * @since 1.5
     */
    public void setLayout(LayoutManager mgr);

4905905: Документация отображения привязки клавиш Swing если устаревший.

Описание:

Swing документирует привязки клавиш для различных компонентов в файлах Key-Index.html, Key-Metal.html, Key-Motif.html и Key-Windows.html. Эти файлы находятся в каталоге, src/share/classes/javax/swing/doc-files, и ссылаются горсткой виджетов Swing. Эти файлы чрезвычайно датированы и никогда действительно задокументировали все привязки клавиш Swing, они были удалены наряду со всеми ссылками на них.

4908889: GTKLookAndFeel должен быть системным стилем для Соляриса w/Gnome

Описание:

Класс Swing UIManager используется, между прочим, чтобы узнать имя класса, который может использоваться, чтобы обеспечить стиль для существующей системы. На Солярисе w/Gnome вызов getSystemLookAndFeelClassName должен возвратить имя пакета для стили GTK.

Это привело к следующим изменениям к UIManager:

    /**
     * Returns the name of the <code>LookAndFeel</code> class that implements
     * the native systems look and feel if there is one, otherwise
     * the name of the default cross platform <code>LookAndFeel</code>
     * class. If the system property <code>swing.systemlaf</code> has been
     * defined, it's value will be returned.
     *
     * @return the <code>String</code> of the <code>LookAndFeel</code>
     *               class
     *
     * @see #setLookAndFeel
     * @see #getCrossPlatformLookAndFeelClassName
     */
    public static String getSystemLookAndFeelClassName();

    /**
     * Returns the name of the <code>LookAndFeel</code> class that implements
     * the default cross platform look and feel -- the Java
     * Look and Feel (JLF).  If the system property
     * <code>swing.crossplatformlaf</code> has been
     * defined, it's value will be returned.
     *
     * @return  a string with the JLF implementation-class
     * @see #setLookAndFeel
     * @see #getSystemLookAndFeelClassName
     */
    public static String getCrossPlatformLookAndFeelClassName();

Как часть этой работы мы также создали WindowsClassicLookAndFeel. Этот класс полезен, чтобы вызвать классику окон, надеются использоваться, даже если Вы выполняете XP.

4953840: Добавьте переопределение getFontMetrics к JComponent

Описание:

Как предшественник обеспечения сглаженного текста в Swing JComponent теперь переопределит следующий метод:

    /**
     * Gets the <code>FontMetrics</code> for the specified <code>Font</code>.
     *
     * @param font the font for which font metrics is to be
     *          obtained
     * @return the font metrics for <code>font</code>
     * @throws NullPointerException if <code>font</code> is null
     * @since 1.5
     */
    public FontMetrics getFontMetrics(Font font);

Потенциальные Несовместимости

Горстка этих изменений API представила потенциальные несовместимости между 5.0 и предыдущие выпуски. На очень немного разработчиков будут влиять эти изменения. Возможные несовместимости упоминаются ниже:

4607364

Океан тянет градиент на кнопках. Градиент будет только оттянут если contentAreaFilled свойство является истиной, или background свойство является экземпляром UIResource. Если Вы не хотите градиент, любой набор contentAreaFilled свойство ко лжи, или набор фон к a non-UIResource. В большинстве случаев это - простое как:

    button.setBackground(Color.RED);

Если по некоторым причинам Вы поднимаете a UIResource Вы должны создать новое Color это не a UIResource, например:

    button.setBackground(new Color(oldColor));

4303294

JTree и JList интерпретируйте перемещение курсора относительно вывода. Например, если вывод находится на строке четыре в a JTree и Вы нажимаете ключ, который выбор изменяет на строку три. Точно так же JTree и JList передайте параметр их средствам рендеринга, указывающим, есть ли у представляемого элемента фокус ⠀”, это основано на том, является ли представляемый элемент выводом. До 5.0, JTable используемый привязка для этих ситуаций; в 5.0, JTable использует вывод. Это могло влиять на разработчиков, которые предполагали, что привязка была ячейкой, которая имеет фокус и могла привести к рендерингу индикатора фокуса в неправильных ситуациях.

4864304

Представлять раскрывающееся для a JComboBox Взгляд Sun и чувства используют экземпляр JScrollPane. JScrollPane конфигурируется, чтобы никогда не иметь горизонтальную полосу прокрутки. В 5.0 setHorizontalScrollBar(null) теперь вызывается.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами