📄 util.java
字号:
/*
* 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 + -