Unicode Display : Unicode « I18N « Java






Unicode Display

Unicode Display
     
/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book (recommended),
 * visit http://www.davidflanagan.com/javaexamples2.
 */

import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollBar;


/**
 * This program displays Unicode glyphs using user-specified fonts and font
 * styles.
 */
public class UnicodeDisplay extends JFrame implements ActionListener {
  int page = 0;

  UnicodePanel p;

  JScrollBar b;

  String fontfamily = "Serif";

  int fontstyle = Font.PLAIN;

  /**
   * This constructor creates the frame, menubar, and scrollbar that work
   * along with the UnicodePanel class, defined below
   */
  public UnicodeDisplay(String name) {
    super(name);
    p = new UnicodePanel(); // Create the panel
    p.setBase((char) (page * 0x100)); // Initialize it
    getContentPane().add(p, "Center"); // Center it

    // Create and set up a scrollbar, and put it on the right
    b = new JScrollBar(Scrollbar.VERTICAL, 0, 1, 0, 0xFF);
    b.setUnitIncrement(1);
    b.setBlockIncrement(0x10);
    b.addAdjustmentListener(new AdjustmentListener() {
      public void adjustmentValueChanged(AdjustmentEvent e) {
        page = e.getValue();
        p.setBase((char) (page * 0x100));
      }
    });
    getContentPane().add(b, "East");

    // Set things up so we respond to window close requests
    this.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    // Handle Page Up and Page Down and the up and down arrow keys
    this.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        int oldpage = page;
        if ((code == KeyEvent.VK_PAGE_UP) || (code == KeyEvent.VK_UP)) {
          if (e.isShiftDown())
            page -= 0x10;
          else
            page -= 1;
          if (page < 0)
            page = 0;
        } else if ((code == KeyEvent.VK_PAGE_DOWN)
            || (code == KeyEvent.VK_DOWN)) {
          if (e.isShiftDown())
            page += 0x10;
          else
            page += 1;
          if (page > 0xff)
            page = 0xff;
        }
        if (page != oldpage) { // if anything has changed...
          p.setBase((char) (page * 0x100)); // update the display
          b.setValue(page); // and update scrollbar to match
        }
      }
    });

    // Set up a menu system to change fonts. Use a convenience method.
    JMenuBar menubar = new JMenuBar();
    this.setJMenuBar(menubar);
    menubar.add(makemenu("Font Family", new String[] { "Serif",
        "SansSerif", "Monospaced" }, this));
    menubar.add(makemenu("Font Style", new String[] { "Plain", "Italic",
        "Bold", "BoldItalic" }, this));
  }

  /** This method handles the items in the menubars */
  public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    if (cmd.equals("Serif"))
      fontfamily = "Serif";
    else if (cmd.equals("SansSerif"))
      fontfamily = "SansSerif";
    else if (cmd.equals("Monospaced"))
      fontfamily = "Monospaced";
    else if (cmd.equals("Plain"))
      fontstyle = Font.PLAIN;
    else if (cmd.equals("Italic"))
      fontstyle = Font.ITALIC;
    else if (cmd.equals("Bold"))
      fontstyle = Font.BOLD;
    else if (cmd.equals("BoldItalic"))
      fontstyle = Font.BOLD + Font.ITALIC;
    p.setFont(fontfamily, fontstyle);
  }

  /** A convenience method to create a Menu from an array of items */
  private JMenu makemenu(String name, String[] itemnames,
      ActionListener listener) {
    JMenu m = new JMenu(name);
    for (int i = 0; i < itemnames.length; i++) {
      JMenuItem item = new JMenuItem(itemnames[i]);
      item.addActionListener(listener);
      item.setActionCommand(itemnames[i]); // okay here, though
      m.add(item);
    }
    return m;
  }

  /** The main() program just create a window, packs it, and shows it */
  public static void main(String[] args) {
    UnicodeDisplay f = new UnicodeDisplay("Unicode Displayer");
    f.pack();
    f.show();
  }

  /**
   * This nested class is the one that displays one "page" of Unicode glyphs
   * at a time. Each "page" is 256 characters, arranged into 16 rows of 16
   * columns each.
   */
  public static class UnicodePanel extends JComponent {
    protected char base; // What character we start the display at

    protected Font font = new Font("serif", Font.PLAIN, 18);

    protected Font headingfont = new Font("monospaced", Font.BOLD, 18);

    static final int lineheight = 25;

    static final int charspacing = 20;

    static final int x0 = 65;

    static final int y0 = 40;

    /** Specify where to begin displaying, and re-display */
    public void setBase(char base) {
      this.base = base;
      repaint();
    }

    /** Set a new font name or style, and redisplay */
    public void setFont(String family, int style) {
      this.font = new Font(family, style, 18);
      repaint();
    }

    /**
     * The paintComponent() method actually draws the page of glyphs
     */
    public void paintComponent(Graphics g) {
      int start = (int) base & 0xFFF0; // Start on a 16-character boundary

      // Draw the headings in a special font
      g.setFont(headingfont);

      // Draw 0..F on top
      for (int i = 0; i < 16; i++) {
        String s = Integer.toString(i, 16);
        g.drawString(s, x0 + i * charspacing, y0 - 20);
      }

      // Draw column down left.
      for (int i = 0; i < 16; i++) {
        int j = start + i * 16;
        String s = Integer.toString(j, 16);
        g.drawString(s, 10, y0 + i * lineheight);
      }

      // Now draw the characters
      g.setFont(font);
      char[] c = new char[1];
      for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++) {
          c[0] = (char) (start + j * 16 + i);
          g.drawChars(c, 0, 1, x0 + i * charspacing, y0 + j
              * lineheight);
        }
      }
    }

    /** Custom components like this one should always have this method */
    public Dimension getPreferredSize() {
      return new Dimension(x0 + 16 * charspacing, y0 + 16 * lineheight);
    }
  }
}
           
         
    
    
    
    
  








Related examples in the same category

1.Character Sets and Unicode: Code Set Conversion
2.Display "special character" using Unicode
3.International friendly string comparison with case-order
4.Generic unicode textreader, which will use BOM mark to identify the encoding to be used. If BOM is not found then use a given default or system encoding.
5.Convert into Hexadecimal notation of Unicode
6.Generic Unicode text reader, which uses a BOM (Byte Order Mark) to identify the encoding to be used.
7.Generic unicode text reader.
8.processing SGML into unicode characters.
9.Write a 16 bit short as LITTLE_ENDIAN
10.Write a 32 bit int as LITTLE_ENDIAN.
11.Arabic Reshaper