KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > util > display > ScaleSelector


1 package prefuse.util.display;
2
3 import java.awt.BorderLayout JavaDoc;
4 import java.awt.Dimension JavaDoc;
5 import java.awt.Graphics JavaDoc;
6 import java.awt.Image JavaDoc;
7
8 import javax.swing.Box JavaDoc;
9 import javax.swing.BoxLayout JavaDoc;
10 import javax.swing.JComponent JavaDoc;
11 import javax.swing.JLabel JavaDoc;
12 import javax.swing.JSlider JavaDoc;
13 import javax.swing.event.ChangeEvent JavaDoc;
14 import javax.swing.event.ChangeListener JavaDoc;
15
16 /**
17  * Swing widget which displays a preview image and helps select the
18  * scale for an exported image.
19  *
20  * @author <a HREF="http://jheer.org">jeffrey heer</a>
21  */

22 public class ScaleSelector extends JComponent JavaDoc implements ChangeListener JavaDoc {
23
24     private final static int MAX_SIZE = 135;
25     
26     private ImagePanel preview;
27     private JLabel JavaDoc value;
28     private JLabel JavaDoc size;
29     private JSlider JavaDoc slider;
30     private Image JavaDoc image;
31     private int width, height;
32     
33     /**
34      * Create a new ScaleSelector.
35      */

36     public ScaleSelector() {
37         slider = new JSlider JavaDoc(1,10,1);
38         value = new JLabel JavaDoc("x1");
39         size = new JLabel JavaDoc(" ");
40         preview = new ImagePanel();
41         
42         value.setPreferredSize(new Dimension JavaDoc(25,10));
43         size.setHorizontalAlignment(JLabel.CENTER);
44         slider.setMajorTickSpacing(1);
45         slider.setSnapToTicks(true);
46         slider.addChangeListener(this);
47         
48         setLayout(new BorderLayout JavaDoc());
49         
50         Box JavaDoc b1 = new Box JavaDoc(BoxLayout.X_AXIS);
51         b1.add(Box.createHorizontalStrut(5));
52         b1.add(Box.createHorizontalGlue());
53         b1.add(preview);
54         b1.add(Box.createHorizontalGlue());
55         b1.add(Box.createHorizontalStrut(5));
56         add(b1, BorderLayout.CENTER);
57         
58         Box JavaDoc b2 = new Box JavaDoc(BoxLayout.X_AXIS);
59         b2.add(slider);
60         b2.add(Box.createHorizontalStrut(5));
61         b2.add(value);
62         
63         Box JavaDoc b3 = new Box JavaDoc(BoxLayout.X_AXIS);
64         b3.add(Box.createHorizontalStrut(5));
65         b3.add(Box.createHorizontalGlue());
66         b3.add(size);
67         b3.add(Box.createHorizontalGlue());
68         b3.add(Box.createHorizontalStrut(5));
69         
70         Box JavaDoc b4 = new Box JavaDoc(BoxLayout.Y_AXIS);
71         b4.add(b2);
72         b4.add(b3);
73         add(b4, BorderLayout.SOUTH);
74     }
75
76     /**
77      * Set the preview image.
78      * @param img the preview image
79      */

80     public void setImage(Image JavaDoc img) {
81         image = getScaledImage(img);
82         stateChanged(null);
83     }
84     
85     /**
86      * Get a scaled version of the input image.
87      * @param img the input image
88      * @return a scaled version of the image
89      */

90     private Image JavaDoc getScaledImage(Image JavaDoc img) {
91         int w = width = img.getWidth(null);
92         int h = height = img.getHeight(null);
93         double ar = ((double)w)/h;
94         
95         int nw = MAX_SIZE, nh = MAX_SIZE;
96         if ( w > h ) {
97             nh = (int)Math.round(nw/ar);
98         } else {
99             nw = (int)Math.round(nh*ar);
100         }
101         return img.getScaledInstance(nw,nh,Image.SCALE_SMOOTH);
102     }
103     
104     /**
105      * Monitor changes to the scale slider.
106      * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
107      */

108     public void stateChanged(ChangeEvent JavaDoc evt) {
109         int scale = slider.getValue();
110         value.setText("x"+String.valueOf(scale));
111         size.setText("Image Size: "+(width*scale)+" x "+(height*scale)+" pixels");
112         preview.repaint();
113     }
114     
115     /**
116      * Get the current image scale reported by the slider.
117      * @return the image scale to use
118      */

119     public double getScale() {
120         return slider.getValue();
121     }
122     
123     /**
124      * Swing component that draws an image scaled to the current
125      * scale factor.
126      */

127     public class ImagePanel extends JComponent JavaDoc {
128         Dimension JavaDoc d = new Dimension JavaDoc(MAX_SIZE, MAX_SIZE);
129         public ImagePanel() {
130             this.setPreferredSize(d);
131             this.setMinimumSize(d);
132             this.setMaximumSize(d);
133         }
134         public void paintComponent(Graphics JavaDoc g) {
135             double scale = 0.4+(0.06*getScale());
136             int w = (int)Math.round(scale*image.getWidth(null));
137             int h = (int)Math.round(scale*image.getHeight(null));
138             Image JavaDoc img = (scale == 1.0 ? image :
139                 image.getScaledInstance(w,h,Image.SCALE_DEFAULT));
140             int x = (MAX_SIZE-w)/2;
141             int y = (MAX_SIZE-h)/2;
142             g.drawImage(img,x,y,null);
143         }
144     }
145     
146 } // end of class ScaleSelector
147
Popular Tags