basictaskpaneui.java

来自「java实现浏览器等本地桌面的功能」· Java 代码 · 共 600 行 · 第 1/2 页

JAVA
600
字号
/* * $Id: BasicTaskPaneUI.java,v 1.6 2005/10/10 18:02:54 rbair Exp $ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */package org.jdesktop.swingx.plaf.basic;import java.awt.Color;import java.awt.Component;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Insets;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.MouseEvent;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import javax.swing.AbstractAction;import javax.swing.Action;import javax.swing.ActionMap;import javax.swing.BorderFactory;import javax.swing.Icon;import javax.swing.InputMap;import javax.swing.JComponent;import javax.swing.JLabel;import javax.swing.LookAndFeel;import javax.swing.SwingUtilities;import javax.swing.UIManager;import javax.swing.border.Border;import javax.swing.border.CompoundBorder;import javax.swing.event.MouseInputAdapter;import javax.swing.event.MouseInputListener;import javax.swing.plaf.ActionMapUIResource;import javax.swing.plaf.ComponentUI;import javax.swing.plaf.basic.BasicGraphicsUtils;import org.jdesktop.swingx.JXCollapsiblePane;import org.jdesktop.swingx.JXHyperlink;import org.jdesktop.swingx.JXTaskPane;import org.jdesktop.swingx.icon.EmptyIcon;import org.jdesktop.swingx.plaf.TaskPaneUI;/** * Base implementation of the <code>JXTaskPane</code> UI. *  * @author <a href="mailto:fred@L2FProd.com">Frederic Lavigne</a> */public class BasicTaskPaneUI extends TaskPaneUI {  private static FocusListener focusListener = new RepaintOnFocus();  public static ComponentUI createUI(JComponent c) {    return new BasicTaskPaneUI();  }  protected static int TITLE_HEIGHT = 25;  protected static int ROUND_HEIGHT = 5;    protected JXTaskPane group;  protected boolean mouseOver;  protected MouseInputListener mouseListener;  protected PropertyChangeListener propertyListener;    public void installUI(JComponent c) {    super.installUI(c);    group = (JXTaskPane)c;    installDefaults();    installListeners();    installKeyboardActions();  }  protected void installDefaults() {    group.setOpaque(true);    group.setBorder(createPaneBorder());    ((JComponent)group.getContentPane()).setBorder(createContentPaneBorder());    LookAndFeel.installColorsAndFont(      group,      "TaskPane.background",      "TaskPane.foreground",      "TaskPane.font");    LookAndFeel.installColorsAndFont(      (JComponent)group.getContentPane(),      "TaskPane.background",      "TaskPane.foreground",      "TaskPane.font");      }  protected void installListeners() {    mouseListener = createMouseInputListener();    group.addMouseMotionListener(mouseListener);    group.addMouseListener(mouseListener);    group.addFocusListener(focusListener);    propertyListener = createPropertyListener();    group.addPropertyChangeListener(propertyListener);  }  protected void installKeyboardActions() {    InputMap inputMap = (InputMap)UIManager.get("TaskPane.focusInputMap");    if (inputMap != null) {      SwingUtilities.replaceUIInputMap(        group,        JComponent.WHEN_FOCUSED,        inputMap);    }    ActionMap map = getActionMap();    if (map != null) {      SwingUtilities.replaceUIActionMap(group, map);    }  }  ActionMap getActionMap() {    ActionMap map = new ActionMapUIResource();    map.put("toggleExpanded", new ToggleExpandedAction());    return map;  }  public void uninstallUI(JComponent c) {    uninstallListeners();    super.uninstallUI(c);  }  protected void uninstallListeners() {    group.removeMouseListener(mouseListener);    group.removeMouseMotionListener(mouseListener);    group.removeFocusListener(focusListener);    group.removePropertyChangeListener(propertyListener);  }  protected MouseInputListener createMouseInputListener() {    return new ToggleListener();  }  protected PropertyChangeListener createPropertyListener() {    return new ChangeListener();  }    protected boolean isInBorder(MouseEvent event) {    return event.getY() < getTitleHeight();  }  protected final int getTitleHeight() {    return TITLE_HEIGHT;  }  protected Border createPaneBorder() {    return new PaneBorder();  }  @Override  public Dimension getPreferredSize(JComponent c) {    Component component = group.getComponent(0);    if (!(component instanceof JXCollapsiblePane)) {      // something wrong in this JXTaskPane      return super.getPreferredSize(c);    }        JXCollapsiblePane collapsible = (JXCollapsiblePane)component;    Dimension dim = collapsible.getPreferredSize();        Border groupBorder = group.getBorder();    if (groupBorder instanceof PaneBorder) {      Dimension border = ((PaneBorder)groupBorder).getPreferredSize(group);      dim.width = Math.max(dim.width, border.width);      dim.height += border.height;    } else {      dim.height += getTitleHeight();    }              return dim;  }    protected Border createContentPaneBorder() {    Color borderColor = UIManager.getColor("TaskPane.borderColor");    return new CompoundBorder(new ContentPaneBorder(borderColor), BorderFactory      .createEmptyBorder(10, 10, 10, 10));  }    public Component createAction(Action action) {    JXHyperlink button = new JXHyperlink(action);    button.setOpaque(false);    button.setBorder(null);    button.setBorderPainted(false);    button.setFocusPainted(true);    button.setForeground(UIManager.getColor("TaskPane.titleForeground"));    return button;  }  protected void ensureVisible() {    SwingUtilities.invokeLater(new Runnable() {      public void run() {        group.scrollRectToVisible(          new Rectangle(group.getWidth(), group.getHeight()));      }    });  }    static class RepaintOnFocus implements FocusListener {    public void focusGained(FocusEvent e) {      e.getComponent().repaint();    }    public void focusLost(FocusEvent e) {      e.getComponent().repaint();    }  }    class ChangeListener implements PropertyChangeListener {    public void propertyChange(PropertyChangeEvent evt) {      // if group is expanded but not animated      // or if animated has reached expanded state      // scroll to visible if scrollOnExpand is enabled      if ((JXTaskPane.EXPANDED_CHANGED_KEY.equals(evt.getPropertyName())        && Boolean.TRUE.equals(evt.getNewValue()) && !group.isAnimated())        || (JXCollapsiblePane.ANIMATION_STATE_KEY.equals(evt.getPropertyName()) && "expanded"          .equals(evt.getNewValue()))) {        if (group.isScrollOnExpand()) {          ensureVisible();        }      }    }  }    class ToggleListener extends MouseInputAdapter {    public void mouseEntered(MouseEvent e) {      if (isInBorder(e)) {        e.getComponent().setCursor(          Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));      } else {        mouseOver = false;        group.repaint();      }    }    public void mouseExited(MouseEvent e) {      e.getComponent().setCursor(Cursor.getDefaultCursor());      mouseOver = false;      group.repaint();    }    public void mouseMoved(MouseEvent e) {      if (isInBorder(e)) {        e.getComponent().setCursor(          Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));        mouseOver = true;        group.repaint();      } else {        e.getComponent().setCursor(Cursor.getDefaultCursor());        mouseOver = false;        group.repaint();      }    }    public void mouseReleased(MouseEvent e) {      if (isInBorder(e)) {        group.setExpanded(!group.isExpanded());      }    }  }    class ToggleExpandedAction extends AbstractAction {    public ToggleExpandedAction() {      super("toggleExpanded");    }    public void actionPerformed(ActionEvent e) {      group.setExpanded(!group.isExpanded());    }    public boolean isEnabled() {      return group.isVisible();    }  }  protected static class ChevronIcon implements Icon {    boolean up = true;    public ChevronIcon(boolean up) {      this.up = up;    }    public int getIconHeight() {      return 3;

⌨️ 快捷键说明

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