1 /* 2 * 3 * Copyright (c) 2007, 2018, 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 }