|
1 /* |
|
2 * |
|
3 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. |
|
4 * |
|
5 * Redistribution and use in source and binary forms, with or without |
|
6 * modification, are permitted provided that the following conditions |
|
7 * are met: |
|
8 * |
|
9 * - Redistributions of source code must retain the above copyright |
|
10 * notice, this list of conditions and the following disclaimer. |
|
11 * |
|
12 * - Redistributions in binary form must reproduce the above copyright |
|
13 * notice, this list of conditions and the following disclaimer in the |
|
14 * documentation and/or other materials provided with the distribution. |
|
15 * |
|
16 * - Neither the name of Oracle nor the names of its |
|
17 * contributors may be used to endorse or promote products derived |
|
18 * from this software without specific prior written permission. |
|
19 * |
|
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
|
21 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
|
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
31 */ |
|
32 package java2d.demos.Fonts; |
|
33 |
|
34 |
|
35 import static java.awt.Color.BLACK; |
|
36 import static java.awt.Color.GRAY; |
|
37 import static java.awt.Color.WHITE; |
|
38 import java.awt.Component; |
|
39 import java.awt.Dimension; |
|
40 import java.awt.Font; |
|
41 import java.awt.FontMetrics; |
|
42 import java.awt.Graphics2D; |
|
43 import java.awt.GraphicsEnvironment; |
|
44 import java.awt.event.ActionEvent; |
|
45 import java.awt.event.ActionListener; |
|
46 import java.util.ArrayList; |
|
47 import java.util.List; |
|
48 import java2d.AnimatingControlsSurface; |
|
49 import java2d.CustomControls; |
|
50 import javax.swing.JMenu; |
|
51 import javax.swing.JMenuBar; |
|
52 import javax.swing.JMenuItem; |
|
53 import javax.swing.JSlider; |
|
54 import javax.swing.SwingConstants; |
|
55 import javax.swing.border.EtchedBorder; |
|
56 import javax.swing.event.ChangeEvent; |
|
57 import javax.swing.event.ChangeListener; |
|
58 |
|
59 |
|
60 /** |
|
61 * Scrolling text of fonts returned from GraphicsEnvironment.getAllFonts(). |
|
62 */ |
|
63 @SuppressWarnings("serial") |
|
64 public class AllFonts extends AnimatingControlsSurface { |
|
65 |
|
66 private static final List<Font> fonts = new ArrayList<Font>(); |
|
67 |
|
68 static { |
|
69 GraphicsEnvironment ge = |
|
70 GraphicsEnvironment.getLocalGraphicsEnvironment(); |
|
71 for (Font font : ge.getAllFonts()) { |
|
72 if (font.canDisplayUpTo(font.getName()) != 0) { |
|
73 fonts.add(font); |
|
74 } |
|
75 } |
|
76 } |
|
77 private int nStrs; |
|
78 private int strH; |
|
79 private int fi; |
|
80 protected int fsize = 14; |
|
81 protected List<Font> v = new ArrayList<Font>(); |
|
82 |
|
83 public AllFonts() { |
|
84 setBackground(WHITE); |
|
85 setSleepAmount(500); |
|
86 setControls(new Component[] { new DemoControls(this) }); |
|
87 } |
|
88 |
|
89 public void handleThread(int state) { |
|
90 } |
|
91 |
|
92 @Override |
|
93 public void reset(int w, int h) { |
|
94 v.clear(); |
|
95 Font f = fonts.get(0).deriveFont(Font.PLAIN, fsize); |
|
96 FontMetrics fm = getFontMetrics(f); |
|
97 strH = (fm.getAscent() + fm.getDescent()); |
|
98 nStrs = h / strH + 1; |
|
99 fi = 0; |
|
100 } |
|
101 |
|
102 @Override |
|
103 public void step(int w, int h) { |
|
104 if (fi < fonts.size()) { |
|
105 v.add(fonts.get(fi).deriveFont(Font.PLAIN, fsize)); |
|
106 } |
|
107 if (v.size() == nStrs && !v.isEmpty() || fi > fonts.size()) { |
|
108 v.remove(0); |
|
109 } |
|
110 fi = v.isEmpty() ? 0 : ++fi; |
|
111 } |
|
112 |
|
113 @Override |
|
114 public void render(int w, int h, Graphics2D g2) { |
|
115 |
|
116 g2.setColor(BLACK); |
|
117 |
|
118 int yy = (fi >= fonts.size()) ? 0 : h - v.size() * strH - strH / 2; |
|
119 |
|
120 for (int i = 0; i < v.size(); i++) { |
|
121 Font f = v.get(i); |
|
122 int sw = getFontMetrics(f).stringWidth(f.getName()); |
|
123 g2.setFont(f); |
|
124 g2.drawString(f.getName(), (w / 2 - sw / 2), yy += strH); |
|
125 } |
|
126 } |
|
127 |
|
128 public static void main(String argv[]) { |
|
129 createDemoFrame(new AllFonts()); |
|
130 } |
|
131 |
|
132 |
|
133 static class DemoControls extends CustomControls implements ActionListener, |
|
134 ChangeListener { |
|
135 |
|
136 AllFonts demo; |
|
137 JSlider slider; |
|
138 int fsize[] = { 8, 14, 18, 24 }; |
|
139 JMenuItem menuitem[] = new JMenuItem[fsize.length]; |
|
140 Font font[] = new Font[fsize.length]; |
|
141 |
|
142 @SuppressWarnings("LeakingThisInConstructor") |
|
143 public DemoControls(AllFonts demo) { |
|
144 this.demo = demo; |
|
145 setBackground(GRAY); |
|
146 |
|
147 int sleepAmount = (int) demo.getSleepAmount(); |
|
148 slider = new JSlider(SwingConstants.HORIZONTAL, 0, 999, sleepAmount); |
|
149 slider.setBorder(new EtchedBorder()); |
|
150 slider.setPreferredSize(new Dimension(90, 22)); |
|
151 slider.addChangeListener(this); |
|
152 add(slider); |
|
153 JMenuBar menubar = new JMenuBar(); |
|
154 add(menubar); |
|
155 JMenu menu = menubar.add(new JMenu("Font Size")); |
|
156 for (int i = 0; i < fsize.length; i++) { |
|
157 font[i] = new Font(Font.SERIF, Font.PLAIN, fsize[i]); |
|
158 menuitem[i] = menu.add(new JMenuItem(String.valueOf(fsize[i]))); |
|
159 menuitem[i].setFont(font[i]); |
|
160 menuitem[i].addActionListener(this); |
|
161 } |
|
162 } |
|
163 |
|
164 @Override |
|
165 public void actionPerformed(ActionEvent e) { |
|
166 for (int i = 0; i < fsize.length; i++) { |
|
167 if (e.getSource().equals(menuitem[i])) { |
|
168 demo.fsize = fsize[i]; |
|
169 Dimension d = demo.getSize(); |
|
170 demo.reset(d.width, d.height); |
|
171 break; |
|
172 } |
|
173 } |
|
174 } |
|
175 |
|
176 @Override |
|
177 public void stateChanged(ChangeEvent e) { |
|
178 demo.setSleepAmount(slider.getValue()); |
|
179 } |
|
180 } |
|
181 } |