1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| package com.company.swing.component;
import java.awt.AWTEvent;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.JComponent;
import javax.swing.JLayer;
import javax.swing.Timer;
import javax.swing.plaf.LayerUI;
import org.jdesktop.swingx.JXCollapsiblePane;
public class AutoCollapsiblePaneFactory {
private static final class LayerUIExtension extends
LayerUI<JXCollapsiblePane> implements ActionListener {
private static final Color COLOR2 = new Color(128,128,128,0);
private static final Color COLOR1 = new Color(128,128,128,255);
private final JXCollapsiblePane pane;
private volatile boolean aimCollapsed = true;
private Timer collapseTimer;
private LayerUIExtension(JXCollapsiblePane pane) {
this.pane = pane;
collapseTimer = new Timer(3000, this);
collapseTimer.setRepeats(false);
}
public void installUI(JComponent c) {
super.installUI(c);
((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
collapseTimer.start();
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
((JLayer) c).setLayerEventMask(0);
collapseTimer.stop();
}
public void paint (Graphics g, JComponent c) {
super.paint(g,c);
}
public void eventDispatched(AWTEvent e, JLayer<? extends JXCollapsiblePane> l) {
// System.out.println(e);
if (e.getID()==MouseEvent.MOUSE_ENTERED)
switchState(false);
if (e.getID()==MouseEvent.MOUSE_EXITED || e.getID()==MouseEvent.MOUSE_DRAGGED)
switchState(true);
}
private void switchState(boolean aimCollapsed) {
this.aimCollapsed=aimCollapsed;
if (aimCollapsed)
collapseTimer.restart();
else{
collapseTimer.stop();
pane.setCollapsed(false);
}
}
/**
* Called by timer
*/
@Override
public void actionPerformed(ActionEvent e) {
pane.setCollapsed(true);
}
}
public static JLayer<JXCollapsiblePane> create(JComponent content,JXCollapsiblePane.Direction direction){
return create(content,direction,20);
}
public static JLayer<JXCollapsiblePane> create(JXCollapsiblePane.Direction direction){
return create(null,direction);
}
public static JLayer<JXCollapsiblePane> create(JXCollapsiblePane.Direction direction, int minSize){
return create(null,direction,minSize);
}
public static JLayer<JXCollapsiblePane> create(JComponent content,JXCollapsiblePane.Direction direction, final int minSize){
final JXCollapsiblePane pane = new JXCollapsiblePane(direction){
@Override
public Dimension getPreferredSize() {
// TODO Auto-generated method stub
Dimension d = super.getPreferredSize();
if (d.width<minSize)
d.width=minSize;
if (d.height<minSize)
d.height=minSize;
return d;
}
};
if (content!=null)
pane.setContentPane(content);
pane.setAnimated(true);;
pane.setCollapsed(false);
JLayer<JXCollapsiblePane> layer = new JLayer<>(pane, new LayerUIExtension(pane));
return layer;
}
} |
Partager