Java tutorial
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.Label; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.MenuShortcut; import java.awt.Panel; import java.awt.Toolkit; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.DecimalFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; /** * Unicode - show a page of Unicode characters. BUG: Times throws a bunch of * exceptions on page 2 and 3, that can not be caught as they occur in the AWT * thread. On some platforms. * * TODO - remove GoToPage as a dialog, move its textfield into main GUI. * * @author Ian Darwin, http://www.darwinsys.com/ * @version $Id: Unicode.java,v 1.7 2004/02/09 03:33:50 ian Exp $ */ public class Unicode extends JFrame { /** "main program" method - construct and show */ public static void main(String[] av) { // create a Unicode object, tell it to show up new Unicode().setVisible(true); } protected final int COLUMNS = 16, ROWS = 16; /** the unicode char at start of current page */ protected int startNum = 0; protected final int QUADSIZE = ROWS * COLUMNS; /** the buttons that display the characters */ protected JLabel buttons[][] = new JLabel[COLUMNS][ROWS]; /** the font name display */ protected JLabel fontName; /** the row labels, in a column at the left */ protected JLabel rowLabs[] = new JLabel[ROWS]; /** The page chooser pop-up */ protected GoToPage gotoPageUI; /** How git to make the font samples */ protected final int FONTSIZE = 8; /** Construct the object including its GUI */ public Unicode() { super("Unicode"); Container cp = getContentPane(); // Used both for Buttons and Menus ResourceBundle b = ResourceBundle.getBundle("UnicodeWidgets"); JButton quitButton, nextButton, prevButton; Panel p = new Panel(); // Make a grid, add one for labels. p.setLayout(new GridLayout(ROWS + 1, COLUMNS + 1)); DecimalFormat df2d = new DecimalFormat("00"); // Add first row, just column labels. p.add(new JLabel("")); for (int i = 0; i < COLUMNS; i++) p.add(new JLabel(Integer.toString(i, 16), JLabel.CENTER)); // Add subsequent rows, each with an offset label for (int i = 0; i < ROWS; i++) { JLabel l = new JLabel("0000"); // room for max, i.e. \uFFFF p.add(l); rowLabs[i] = l; for (int j = 0; j < COLUMNS; j++) { JLabel pb = new JLabel(" "); buttons[j][i] = pb; p.add(pb); } } // ActionListeners for jumping around; used by buttons and menus ActionListener firster = new ActionListener() { public void actionPerformed(ActionEvent e) { gotoPage(startNum = 0); } }; ActionListener previouser = new ActionListener() { public void actionPerformed(ActionEvent e) { if (startNum > 0) gotoPage(startNum -= QUADSIZE); } }; ActionListener nexter = new ActionListener() { public void actionPerformed(ActionEvent e) { if (startNum < 65535) gotoPage(startNum += QUADSIZE); } }; ActionListener laster = new ActionListener() { public void actionPerformed(ActionEvent e) { gotoPage(65536 - QUADSIZE); } }; cp.add(BorderLayout.NORTH, p); fontName = new JLabel("Default font", JLabel.CENTER); cp.add(BorderLayout.CENTER, fontName); Panel q = new Panel(); cp.add(BorderLayout.SOUTH, q); q.add(prevButton = mkButton(b, "page.prev")); prevButton.addActionListener(previouser); q.add(nextButton = mkButton(b, "page.next")); nextButton.addActionListener(nexter); q.add(quitButton = mkButton(b, "exit")); quitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); System.exit(0); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); dispose(); System.exit(0); } }); MenuItem mi; // used in various spots MenuBar mb = new MenuBar(); setMenuBar(mb); String titlebar; try { titlebar = b.getString("program" + ".title"); } catch (MissingResourceException e) { titlebar = "Unicode Demo"; } setTitle(titlebar); ActionListener fontSelector = new ActionListener() { public void actionPerformed(ActionEvent e) { String font = e.getActionCommand(); mySetFont(font, FONTSIZE); } }; Menu fontMenu = mkMenu(b, "font"); // String[] fontList = Toolkit.getDefaultToolkit().getFontList(); String[] fontList = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); for (int i = 0; i < fontList.length; i++) { fontMenu.add(mi = new MenuItem(fontList[i])); mi.addActionListener(fontSelector); } mb.add(fontMenu); gotoPageUI = new GoToPage("Unicode Page"); centre(gotoPageUI); Menu vm = mkMenu(b, "page"); vm.add(mi = mkMenuItem(b, "page", "first")); mi.addActionListener(firster); vm.add(mi = mkMenuItem(b, "page", "prev")); mi.addActionListener(previouser); vm.add(mi = mkMenuItem(b, "page", "next")); mi.addActionListener(nexter); vm.add(mi = mkMenuItem(b, "page", "last")); mi.addActionListener(laster); vm.add(mi = mkMenuItem(b, "page", "goto")); mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Unicode.this.gotoPageUI.setVisible(true); } }); mb.add(vm); Menu hm = mkMenu(b, "help"); hm.add(mi = mkMenuItem(b, "help", "about")); mb.setHelpMenu(hm); // needed for portability (Motif, etc.). pack(); // After packing the Frame, centre it on the screen. centre(this); // start at a known place mySetFont(fontList[0], FONTSIZE); gotoPage(startNum); } // End of huge Constructor private void mySetFont(String font, int sz) { fontName.setText("Font = " + font); Font f = new Font(font, Font.PLAIN, sz); for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) buttons[i][j].setFont(f); } repaint(); } public void centre(Window c) { Dimension us = c.getSize(), them = Toolkit.getDefaultToolkit().getScreenSize(); int newX = (them.width - us.width) / 2; int newY = (them.height - us.height) / 2; c.setLocation(newX, newY); } /** * Go to a given page of Unicode. At present the parameter is a code value, * but it should be a page #. */ private void gotoPage(int startNum) { // System.out.println("startAt(" + startNum + ")"); char chars[] = new char[1]; for (int i = 0; i < ROWS; i++) { JLabel l = rowLabs[i]; // System.out.println("i=" + i + ", JLabel=" + l); l.setText(Integer.toString(startNum + (i * COLUMNS), 16)); // l.validate(); // size may be too big now for (int j = 0; j < COLUMNS; j++) { chars[0] = (char) (startNum + ((j * ROWS) + i)); JLabel b = buttons[i][j]; b.setText(new String(chars)); } } repaint(); } /** Convenience routine to make a Button */ public JButton mkButton(ResourceBundle b, String name) { String label; try { label = b.getString(name + ".label"); } catch (MissingResourceException e) { label = name; } return new JButton(label); } /** Convenience routine to make a Menu */ public Menu mkMenu(ResourceBundle b, String name) { String menuLabel; try { menuLabel = b.getString(name + ".label"); } catch (MissingResourceException e) { menuLabel = name; } return new Menu(menuLabel); } /** Convenience routine to make a MenuItem */ public MenuItem mkMenuItem(ResourceBundle b, String menu, String name) { String miLabel; try { miLabel = b.getString(menu + "." + name + ".label"); } catch (MissingResourceException e) { miLabel = name; } String key = null; try { key = b.getString(menu + "." + name + ".key"); } catch (MissingResourceException e) { key = null; } if (key == null) return new MenuItem(miLabel); else return new MenuItem(miLabel, new MenuShortcut(key.charAt(0))); } /** * Implement a simple "Go To Page" dialog Row one: "Go to Page", textfield * second OK, Cancel buttons. */ class GoToPage extends Frame { /** TextField used to enter the number */ protected JTextField tf; /** The OK button */ protected Button ok; /** The cancel button */ protected Button can; /** Construct a GoToPage window (no actions yet) */ public GoToPage(String title) { setTitle(title); Container cp = getContentPane(); Label l = new Label("Quadrant number (hex):"); tf = new JTextField(4); tf.setText("1"); // set the text initially selected so you can easily overtype it tf.selectAll(); ok = new Button("OK"); can = new Button("Cancel"); can.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); } }); ActionListener doIt = new ActionListener() { public void actionPerformed(ActionEvent e) { int n = -1; try { n = getValue(); } catch (IllegalArgumentException notANumber) { // handled below } if (n >= 0 && n <= 255) { gotoPage(startNum = n * QUADSIZE); setVisible(false); } else Toolkit.getDefaultToolkit().beep(); } }; ok.addActionListener(doIt); tf.addActionListener(doIt); Panel top = new Panel(); top.add(l); top.add(tf); Panel bottom = new Panel(); bottom.add(ok); bottom.add(can); cp.add(BorderLayout.NORTH, top); cp.add(BorderLayout.SOUTH, bottom); pack(); } protected int getValue() { int i = Integer.parseInt(tf.getText(), 16); return i; } } } //UnicodeWidgets.properties /* program.title=Unicode lister, by Ian Darwin # # The Exit button exit.label=Close # # The Font Family Menu # font.label=Font Family # font names, hence menuitems, are discovered from Toolkit by the program # # The Page Menu # page.label=Page page.first.label=Quadrant 0 (ASCII) page.first.key=F page.prev.label=Previous Quadrant page.prev.key=P page.next.label=Next Quadrant page.next.key=N page.last.label=Last Quadrant page.last.key=L page.goto.label=Goto Page... page.goto.key=G # # The Help Menu # help.label=Help help.about.label=About */