JXLayer 是一个很好的Swing 控件装饰类库,其主要要的优点在于将修饰的一些UI与原本的UI 实现了很好的分离,便于操作和管理。
下面简单介绍一下几个常用的使用方法(API:http://www.jarvana.com/jarvana/view/org/swinglabs/jxlayer/3.0.4/jxlayer-3.0.4-javadoc.jar!/index.html)
JXLayer 此类对象是我们使用JXLayer 最终要使用的对象,其作用就像一个中间件,将我们自己的UI和单独定义的LayerUI 结合在一起,达到最终要的结果。
LayerUI 此类 与XLayer 结合,在LayerUI 的paint 方法中画出你要修饰的图案。并且在这个里面可以监听到控件的事件,这个需要重写eventDispatched(AWTEvent, JXLayer)
LockableUI 此类提供了锁定控件的功能,在以前如果你设置一个JCompent enable 为false,它的子控件依然可以被使用,而此类可以完全实现,并对鼠标图标可以进行自定义。
SpotLightUI 此类简单的说就是在控件上面加一个罩子,可以设置颜色等等。
DebugRepaintingUI 这个类的功能很2, 它能实现的是显示哪些UI 被重画了,相当一个debug 效果。
JScrollPane 这个类提供的功能是鼠标中间键按住之后拖动 可以拖动scrollbar 的效果,可惜在3.0.4版本中我新加的控件不知道哪里去了。
ButtonPanelUI 这个类能干事么? 用了之后没感觉到:(
下面写了一个简单的UI 使用插件
package lyon.study.jxlayer;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.LayerUI;
import org.jdesktop.jxlayer.plaf.ext.ButtonPanelUI;
import org.jdesktop.jxlayer.plaf.ext.DebugRepaintingUI;
import org.jdesktop.jxlayer.plaf.ext.LockableUI;
import org.jdesktop.jxlayer.plaf.ext.MouseScrollableUI;
import org.jdesktop.jxlayer.plaf.ext.SpotLightUI;
public class UIPlug{
private static LayerUI<JComponent> drawRoundRectLayerUI;
private static Map<JComponent,LockableUI> lockLayers=new HashMap<JComponent,LockableUI>();
public static JComponent drowRoundRect(final JComponent com){
return new JXLayer<JComponent>(com,getLayerUI());
}
private static LayerUI<JComponent> getLayerUI() {
drawRoundRectLayerUI=drawRoundRectLayerUI!=null?drawRoundRectLayerUI:new LayerUI<JComponent>(){
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 7131940091813767911L;
@Override
public void paint(Graphics g, JComponent jComponent) {
super.paint(g, jComponent);
final int width = jComponent.getWidth();
final int height = jComponent.getHeight();
g.setColor(Color.BLUE);
g.drawRoundRect(5,5,width-10,height-10,90,90);
g.dispose();
}
};
return drawRoundRectLayerUI;
}
public static JComponent doLockUI(final JComponent com,final boolean isLocked){
LockableUI lockableUI;
if(lockLayers.containsKey(com)){
lockableUI = lockLayers.get(com);
if(lockableUI!=null){
lockableUI.setLocked(isLocked);
}
return com;
}else{
lockableUI=new LockableUI();
lockableUI.setLockedCursor(Cursor.getDefaultCursor());
lockLayers.put(com, lockableUI);
final JXLayer<JComponent> layer = new JXLayer<JComponent>(com, lockableUI);
lockableUI.setLocked(isLocked);
return layer;
}
}
public static JComponent addColorCoverLayer(final JComponent com){
SpotLightUI spotLightUI = new SpotLightUI();
spotLightUI.setShadowEnabled(true);
return new JXLayer<JComponent>(com,spotLightUI);
}
public static JXLayer<JScrollPane> autoScrollPanel(final JScrollPane com){
return new JXLayer<JScrollPane>(com,new MouseScrollableUI());
}
public static JComponent debugPanel(final JComponent com){
DebugRepaintingUI debugUI = new DebugRepaintingUI();
JXLayer<JComponent> layer = new JXLayer<JComponent>(com, debugUI);
return layer;
}
public static JComponent buttonPanel(final JComponent com){
ButtonPanelUI ui=new ButtonPanelUI();
return new JXLayer<JComponent>(com, ui);
}
}