⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.java

📁 SWING的界面UI包 SWING的界面UI包
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/*
 * Util.java
 *
 * Created on August 1, 2007, 1:38 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package dyno.swing.designer.beans;

import dyno.swing.designer.beaninfo.DefaultValue;
import dyno.swing.designer.beans.painters.NullLayoutPainter;
import dyno.swing.designer.properties.editors.BooleanEditor;
import dyno.swing.designer.properties.editors.BorderEditor;
import dyno.swing.designer.properties.editors.ColorEditor;
import dyno.swing.designer.properties.editors.DimensionEditor;
import dyno.swing.designer.properties.editors.DoubleEditor;
import dyno.swing.designer.properties.editors.FloatEditor;
import dyno.swing.designer.properties.editors.FontEditor;
import dyno.swing.designer.properties.editors.InsetsEditor;
import dyno.swing.designer.properties.editors.IntegerPropertyEditor;
import dyno.swing.designer.properties.editors.LongEditor;
import dyno.swing.designer.properties.editors.PointEditor;
import dyno.swing.designer.properties.editors.RectangleEditor;
import dyno.swing.designer.properties.editors.StringEditor;
import dyno.swing.designer.properties.renderer.BorderCellRenderer;
import dyno.swing.designer.properties.renderer.ColorCellRenderer;
import dyno.swing.designer.properties.renderer.DimensionCellRenderer;
import dyno.swing.designer.properties.renderer.FontCellRenderer;
import dyno.swing.designer.properties.renderer.PointCellRenderer;
import dyno.swing.designer.properties.renderer.RectangleCellRenderer;
import dyno.swing.designer.properties.editors.RectangleEditor;
import dyno.swing.designer.properties.renderer.InsetsCellRenderer;
import dyno.swing.designer.properties.types.Item;
import dyno.swing.designer.properties.wrappers.BorderWrapper;
import dyno.swing.designer.properties.wrappers.ColorWrapper;
import dyno.swing.designer.properties.wrappers.ComboBoxModelWrapper;
import dyno.swing.designer.properties.wrappers.DimensionWrapper;
import dyno.swing.designer.properties.wrappers.FontWrapper;
import dyno.swing.designer.properties.wrappers.IconWrapper;
import dyno.swing.designer.properties.wrappers.ImageWrapper;
import dyno.swing.designer.properties.wrappers.InsetsWrapper;
import dyno.swing.designer.properties.wrappers.ListModelWrapper;
import dyno.swing.designer.properties.wrappers.PointWrapper;
import dyno.swing.designer.properties.wrappers.RectangleWrapper;
import dyno.swing.designer.properties.wrappers.SourceCoder;
import dyno.swing.designer.properties.wrappers.SpinnerModelWrapper;
import dyno.swing.designer.properties.wrappers.primitive.StringWrapper;
import dyno.swing.designer.properties.wrappers.TableModelSourceCoder;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.beans.BeanInfo;
import java.beans.Beans;
import java.beans.EventSetDescriptor;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.ListModel;
import javax.swing.LookAndFeel;
import javax.swing.SpinnerModel;
import javax.swing.UIManager;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.plaf.basic.BasicBorders;
import javax.swing.plaf.basic.BasicBorders.MarginBorder;
import javax.swing.plaf.basic.BasicBorders.RadioButtonBorder;
import javax.swing.plaf.basic.BasicBorders.SplitPaneBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

/**
 * 工具类,提供常用的工具方法
 * @author William Chen
 */
public class Util implements Constants {

    private static Item[] GUI_TYPES = new Item[]{new Item("JFrame", "NewJFrame", "javax.swing.JFrame"),
            new Item("JPanel", "NewJPanel", "javax.swing.JPanel")};

    public static Item[] getGuiTypes() {
        return GUI_TYPES;
    }

    public static boolean isXP() {
        Boolean xp = (Boolean) Toolkit.getDefaultToolkit().getDesktopProperty("win.xpstyle.themeActive");
        return xp != null && xp.booleanValue();
    }

    public static Item getDefaultGuiType() {
        return GUI_TYPES[0];
    }
    private static HashMap<Class, Class<? extends PropertyEditor>> propertyEditorClasses;
    private static HashMap<Class, Class<? extends TableCellRenderer>> cellRendererClasses;
    private static HashMap<Class, Class<? extends SourceCoder>> sourceCoders;
    static {
        propertyEditorClasses = new HashMap<Class, Class<? extends PropertyEditor>>();
        propertyEditorClasses.put(String.class, StringEditor.class);
        propertyEditorClasses.put(boolean.class, BooleanEditor.class);
        propertyEditorClasses.put(Color.class, ColorEditor.class);
        propertyEditorClasses.put(Font.class, FontEditor.class);
        propertyEditorClasses.put(Point.class, PointEditor.class);
        propertyEditorClasses.put(Dimension.class, DimensionEditor.class);
        propertyEditorClasses.put(Rectangle.class, RectangleEditor.class);
        propertyEditorClasses.put(int.class, IntegerPropertyEditor.class);
        propertyEditorClasses.put(long.class, LongEditor.class);
        propertyEditorClasses.put(float.class, FloatEditor.class);
        propertyEditorClasses.put(double.class, DoubleEditor.class);
        propertyEditorClasses.put(Border.class, BorderEditor.class);
        propertyEditorClasses.put(Insets.class, InsetsEditor.class);

        cellRendererClasses = new HashMap<Class, Class<? extends TableCellRenderer>>();
        cellRendererClasses.put(Color.class, ColorCellRenderer.class);
        cellRendererClasses.put(Font.class, FontCellRenderer.class);
        cellRendererClasses.put(String.class, DefaultTableCellRenderer.class);
        cellRendererClasses.put(int.class, DefaultTableCellRenderer.class);
        cellRendererClasses.put(long.class, DefaultTableCellRenderer.class);
        cellRendererClasses.put(float.class, DefaultTableCellRenderer.class);
        cellRendererClasses.put(double.class, DefaultTableCellRenderer.class);
        cellRendererClasses.put(Point.class, PointCellRenderer.class);
        cellRendererClasses.put(Dimension.class, DimensionCellRenderer.class);
        cellRendererClasses.put(Rectangle.class, RectangleCellRenderer.class);
        cellRendererClasses.put(Border.class, BorderCellRenderer.class);
        cellRendererClasses.put(Insets.class, InsetsCellRenderer.class);

        sourceCoders = new HashMap<Class, Class<? extends SourceCoder>>();
        sourceCoders.put(String.class, StringWrapper.class);
        sourceCoders.put(Color.class, ColorWrapper.class);
        sourceCoders.put(Font.class, FontWrapper.class);
        sourceCoders.put(Icon.class, IconWrapper.class);
        sourceCoders.put(Image.class, ImageWrapper.class);
        sourceCoders.put(Dimension.class, DimensionWrapper.class);
        sourceCoders.put(Point.class, PointWrapper.class);
        sourceCoders.put(Rectangle.class, RectangleWrapper.class);
        sourceCoders.put(Border.class, BorderWrapper.class);
        sourceCoders.put(Insets.class, InsetsWrapper.class);
        sourceCoders.put(ListModel.class, ListModelWrapper.class);
        sourceCoders.put(ComboBoxModel.class, ComboBoxModelWrapper.class);
        sourceCoders.put(TableModel.class, TableModelSourceCoder.class);
        sourceCoders.put(SpinnerModel.class, SpinnerModelWrapper.class);
        sourceCoders.put(Insets.class, InsetsWrapper.class);
        sourceCoders.put(Point.class, PointWrapper.class);
    }

    public static boolean isDesigning(Component component) {
        String name = component.getName();
        return name != null && name.startsWith("_$$");
    }

    public static String getComponentName(Component component) {
        String name = component.getName();
        if (name != null && name.startsWith("_$$")) {
            return name.substring(3);
        } else {
            return name;
        }
    }

    public static void addContainerNotify(Container container) {
        container.addNotify();
        int count = container.getComponentCount();
        for (int i = 0; i < count; i++) {
            Component comp = container.getComponent(i);
            if (comp instanceof Container) {
                addContainerNotify((Container) comp);
            } else {
                comp.addNotify();
            }
        }
    }

    public static void initComponentAdapter(SwingDesigner designer, Container container) {
        if (isDesigning(container)) {
            AdapterBus.getComponentAdapter(designer, container);
        }

        int count = container.getComponentCount();
        for (int i = 0; i < count; i++) {
            Component comp = container.getComponent(i);
            if (comp instanceof Container) {
                initComponentAdapter(designer, (Container) comp);
            } else if (isDesigning(comp)) {
                AdapterBus.getComponentAdapter(designer, comp);
            }
        }
    }

    public static void setComponentName(Component component, String newName) {
        component.setName("_$$" + newName);
    }

    public static Component findComponentWithName(String name, Component root) {
        String rootName = getComponentName(root);
        if (rootName != null && rootName.equals(name)) {
            return root;
        }
        if (root instanceof Container) {
            Container container = (Container) root;
            int count = container.getComponentCount();
            for (int i = 0; i < count; i++) {
                Component child = container.getComponent(i);
                if (isDesigning(child)) {
                    Component comp = findComponentWithName(name, child);
                    if (comp != null) {
                        return comp;
                    }
                }
            }
        }
        return null;
    }

    /**
     * 重新布局容器,递归调用完成设计界面的更新。主要用于布局管理器改变时,或者组件尺寸被拖拽
     * 发生变化时。
     *
     */
    public static void layoutContainer(Container container) {
        Container parent = getTopContainer(container);
        _layoutContainer(parent);
    }

    /**
     * 由container开始上溯到第一个没有布局管理器的组件容器
     */
    private static Container getTopContainer(Container container) {
        Container parent = container.getParent();

        if (parent == null) {
            return container;
        }

        LayoutManager layout = parent.getLayout();

        if (layout == null) {
            return container;
        }

        return getTopContainer(parent);
    }

    public static boolean isComponentVisible(Component comp) {
        if (!comp.isVisible() && !isRootComponent(comp)) {
            return false;
        }
        if (comp instanceof JInternalFrame) {
            JInternalFrame jif = (JInternalFrame) comp;
            if (jif.isIcon()) {
                return false;
            }
        }
        Component parent = comp.getParent();

        if (parent != null) {
            return isComponentVisible(parent);
        }

        return true;
    }

    /**
     * 递归方式布局整个由container开始的容器
     */
    private static void _layoutContainer(Container container) {
        LayoutManager layout = container.getLayout();
        if (layout != null) {
            container.doLayout();
        }

        int count = container.getComponentCount();

        for (int i = 0; i < count; i++) {
            Component child = container.getComponent(i);

            if (child instanceof Container) {
                _layoutContainer((Container) child);
            }
        }
    }

    /**
     * 获取component所在的容器的绝对位置
     */
    public static Rectangle getRelativeBounds(Component component) {
        Rectangle bounds = new Rectangle(0, 0, component.getWidth(), component.getHeight());
        Container parent = component.getParent();

        while (parent != null) {
            bounds.x += component.getX();
            bounds.y += component.getY();
            component = parent;
            parent = component.getParent();
        }

        return bounds;
    }

    /**
     * 使用beanInfo初始化一个组件,并赋予beanNamed的变量名
     */
    public static Component instantiateBean(SwingDesigner designer, BeanInfo beanInfo, String beanName) {
        LookAndFeel idelnf = designer.getIdeLnf();
        try {
            UIManager.setLookAndFeel(designer.getDesignLnf());
            Class bean_class = beanInfo.getBeanDescriptor().getBeanClass();
            Component comp = (Component) bean_class.newInstance();
            Util.setComponentName(comp, beanName);
            ComponentAdapter adapter = AdapterBus.createComponentAdapter(designer, comp);
            adapter.initialize();
            comp.addNotify();
            ((JComponent) comp).putClientProperty("component.adapter", adapter);
            return comp;

⌨️ 快捷键说明

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