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 + -
显示快捷键?