/* * MoraDrill.java * Version last updated 6 April 2010 * Written by John K. Estell * Created on November 30, 2008, 10:22 PM */

Similar documents
* To change this license header, choose License Headers in Project Properties.

Answer on question #61311, Programming & Computer Science / Java

* To change this license header, choose License Headers in Project Properties.

Java Programming Summer 2008 LAB. Thursday 8/21/2008

/** Creates new form NewJFrame */ public NewJFrame() { initcomponents(); initblogsearch(); //initializes Index List box }

Travel Agency. Khateeb Engineering Classes. Mini Project. Khateeb Engineering Classes: / Technology to be used

Proposed Overhaul of kzvariant Data in the Unihan Database

I.1 Introduction Matisse GUI designer I.2 GroupLayout Basics Sequential and Parallel Arrangements sequential horizontal orientation

jlabel14 = new javax.swing.jlabel(); jlabel15 = new javax.swing.jlabel(); jlabel16 = new javax.swing.jlabel(); jlabel17 = new javax.swing.

JAVA CODE JAVA CODE: BINOMIAL TREES OPTION PRICING BINOMIALTREE CLASS PAGE 1

Appendix I: Software Coding

CHAPTER 8 INFERENCE. The concept of Inference would be explained in the following chapter, as the CTBN

Khmer Angkor Keyboard

N'Ko Keyboard. Overview. Keyboard 2012 Tavultesoft Pty Ltd

A. Administrative. B. Technical General L2/ DATE:

ISO/IEC JTC1/SC2/WG2 N3244

Orientalistic cuneiform

PCL Greek-8 - Code Page 869

Markham J. Geller K The first of the tablets presented here is a bilingual incantation which has one line also found in Utukkū Lemnūtu.

a i u e o - k s t n h! " # $ m % & ' y ( ) * +, r -. w /

Tabella dei caratteri ASCII e UNICODE

European Ordering Rules

Hanley s Survival Guide for Visual Applications with NetBeans 2.0 Last Updated: 5/20/2015 TABLE OF CONTENTS

This is the java code for generating coördinates of molecules numerically using the CDNT framework with real-time input and diagramatic output.

Project Helpine Report BANQUET HALL BOOKING

DAFTAR LAMPIRAN. Source Code Java Aplikasi Keyword to Image Renamer Split

EXECUTIVE DIGITAL KEYSET USER GUIDE

SC22/WG20 N891R. L2/ (formerly L2/01-405) 1 Introduction ISO/IEC JTC 1/SC2/WG2 N2405R. Title: Ordering rules for Hangul. 1.

INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO

Based on slides by Prof. Burton Ma

Communication and processing of text in the Chuvash, Erzya Mordvin, Komi, Hill Mari, Meadow Mari, Moksha Mordvin, Russian, and Udmurt languages.

MITEL. Endpoint and Voice Mail Administrator Guide

グラフを表すデータ構造 JAVA での実装

import java.applet.applet; import java.applet.audioclip; import java.net.url; public class Vjesala2 {

Template for comments and secretariat observations Date: Document: ISO/IEC 10646:2014 PDAM2

privateint m, n, smithitemcount, raitaitemcount;

A Simple Text Editor Application

SampleApp.java. Page 1

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Role-Coll Role Based Collaboration Software

LAMPIRAN PERANGKAT LUNAK

Fonts and Character Sets Applications Manual

Unified input on proposed changes to Unihan readings

Communication and processing of text in the Kildin Sámi, Komi, and Nenets, and Russian languages.

ISO/IEC JTC 1/SC 35. User Interfaces. Secretariat: Association Française de Normalisation (AFNOR)

Zeichen-Referenztabelle (1-127)

We have several alternatives now, which we need to address. Here is a list of them: 1. How to get HTML interpreted correctly.

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

TABLET X. Siglum Museum number Plate in George. z IM (ND 4381) 32 3 i // v variant text, see Chapter 7 ii // vi // XI ?

Goals. Lecture 7 More GUI programming. The application. The application D&D 12. CompSci 230: Semester JFrame subclass: ListOWords

ESANN'2001 proceedings - European Symposium on Artificial Neural Networks Bruges (Belgium), April 2001, D-Facto public., ISBN ,

ISO/IEC INTERNATIONAL STANDARD

// autor igre Ivan Programerska sekcija package mine;

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Page 1 of 16. Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Chinese IDN Language Table: Language Tag: Language Description: Chinese Version: 1.0. Contact Phone:

ENDF/B-VII.1 versus ENDFB/-VII.0: What s Different?

Chapter 8. Java continued. CS Hugh Anderson s notes. Page number: 264 ALERT. MCQ test next week. This time. This place.

Java continued. Chapter 8 ALERT ALERT. Last week. MCQ test next week. This time. This place. Closed book. Assignment #2 is for groups of 3

Blending Content for South Asian Language Pedagogy Part 2: South Asian Languages on the Internet

Class Libraries. Readings and References. Java fundamentals. Java class libraries and data structures. Reading. Other References

COMP16121 Sample Code Lecture 1

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

AppBisect > PrBisect > class Functie. AppBisect > PrBisect > class Punct. public class Functie { double x(double t) { return t;

TMCH Report March February 2017

Swing - JTextField. Adding a text field to the main window (with tooltips and all)

Graphical User Interface

Bengali Script: Formation of the Reph and Yaphala, and use of the ZERO WIDTH JOINER and ZERO WIDTH NON-JOINER

AP CS Unit 11: Graphics and Events

TABLET VII. Siglum Museum number Plate in George

ming 3 Resize the Size to [700, 500]. Note that the background containers in the program code: reference the then under () { 153, 255, 0 ) );

17 GUI API: Container 18 Hello world with a GUI 19 GUI API: JLabel 20 GUI API: Container: add() 21 Hello world with a GUI 22 GUI API: JFrame: setdefau

Lampiran A. SOURCE CODE PROGRAM

Character Properties 4

Hardware withdrawal: ThinkPad and IdeaPad laptop select models and machine types - Replacements available

TECHNICAL DOCUMENTATION

Multiple Choice Questions: Identify the choice that best completes the statement or answers the question. (15 marks)

PCL ISO 8859/5 Latin/Cyrillic

PART 23. Java GUI Advanced JList Component. more items.

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

B. Technical General 1. Choose one of the following: 1a. This proposal is for a new script (set of characters) Yes.

GUI (Graphic User Interface) Programming. Part 2 (Chapter 8) Chapter Goals. Events, Event Sources, and Event Listeners. Listeners

APPENDIX. public void cekroot() { System.out.println("nilai root : "+root.data); }

package As7BattleShip;

Part I: Learn Common Graphics Components

The class definition is not a program by itself. It can be used by other programs in order to create objects and use them.

Page 1 of 16. Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

FLIGHTS TO / FROM CANADA ARE DOMESTIC

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Üù àõ [tai 2 l 6] (in older orthography Üù àõ»). Tai Le orthography is simple and straightforward:

Proctors are unable to respond to queries about the interpretation of exam questions. Do your best to answer exam questions as written.

Client-side GUI. A simple Swing-gui for searching for proudcts

Best practice when using non-alphabetic characters in orthographies:

MIT AITI Swing Event Model Lecture 17

Queens College, CUNY Department of Computer Science. CS 212 Object-Oriented Programming in Java Practice Exam 2. CS 212 Exam 2 Study Guide

ANSWER KEY Exam 2 Computer Programming 230 Dr. St. John Lehman College City University of New York Thursday, 5 November 2009

COMP16121 Notes on Mock Exam Questions

DESIGN AND IMPLEMENTATION OF A PUZZLE GAME USING JAVA SE 1. University Politehnica Timisoara, Faculty Engineering Hunedoara, ROMANIA

ETSI DES v36 ( )

Transcription:

/* * MoraDrill.java * Version 2.1.0 - last updated 6 April 2010 * Written by John K. Estell * Created on November 30, 2008, 10:22 PM */ package MoraDrill; import java.io.inputstream; import java.awt.*; import java.util.*; import javax.swing.*; /** * * @author John K. Estell */ public class MoraDrill extends javax.swing.jframe { // symbolic declaration of the two forms of mora being used public enum ScriptType { Katakana, Hiragana private ScriptType usescripttype = ScriptType.Katakana; // symbolic declaration of the two fonts for rendering mora public enum FontType { Typeset, Brushstroke private FontType usefonttype = FontType.Typeset; // TrueType fonts are used with this application, so they must be defined... private Font typesetfont; private Font brushstrokefont; // flags for keeping track of when mora sounds are to be played private boolean playifcorrect = false; private boolean playifincorrect = false; // declaration of mora // First Table: Gozyuuon-hyoo // Seion // column 1: vowels private final static Mora A = new Mora( "a", '\u3042', '\u30a2', 1, 1 ); private final static Mora I = new Mora( "i", '\u3044', '\u30a4', 2, 1 ); private final static Mora U = new Mora( "u", '\u3046', '\u30a6', 3, 1 ); private final static Mora E = new Mora( "e", '\u3048', '\u30a8', 4, 1 ); private final static Mora O = new Mora( "o", '\u304a', '\u30aa', 5, 1 ); // column 2: k private final static Mora KA = new Mora( "ka", '\u304b', '\u30ab', 1, 2 ); private final static Mora KI = new Mora( "ki", '\u304d', '\u30ad', 2, 2 ); private final static Mora KU = new Mora( "ku", '\u304f', '\u30af', 3, 2 ); private final static Mora KE = new Mora( "ke", '\u3051', '\u30b1', 4, 2 ); private final static Mora KO = new Mora( "ko", '\u3053', '\u30b3', 5, 2 ); // column 3: s private final static Mora SA = new Mora( "sa", '\u3055', '\u30b5', 1, 3 ); private final static Mora SI = new Mora( "si", '\u3057', '\u30b7', 2, 3 ); private final static Mora SU = new Mora( "su", '\u3059', '\u30b9', 3, 3 ); private final static Mora SE = new Mora( "se", '\u305b', '\u30bb', 4, 3 ); private final static Mora SO = new Mora( "so", '\u305d', '\u30bd', 5, 3 ); // column 4: t private final static Mora TA = new Mora( "ta", '\u305f', '\u30bf', 1, 4 ); private final static Mora TI = new Mora( "ti", '\u3061', '\u30c1', 2, 4 ); private final static Mora TU = new Mora( "tu", '\u3064', '\u30c4', 3, 4 ); private final static Mora TE = new Mora( "te", '\u3066', '\u30c6', 4, 4 ); private final static Mora TO = new Mora( "to", '\u3068', '\u30c8', 5, 4 ); // column 5: n private final static Mora NA = new Mora( "na", '\u306a', '\u30ca', 1, 5 ); private final static Mora NI = new Mora( "ni", '\u306b', '\u30cb', 2, 5 ); private final static Mora NU = new Mora( "nu", '\u306c', '\u30cc', 3, 5 ); private final static Mora NE = new Mora( "ne", '\u306d', '\u30cd', 4, 5 ); private final static Mora NO = new Mora( "no", '\u306e', '\u30ce', 5, 5 );

// column 6: h private final static Mora HA = new Mora( "ha", '\u306f', '\u30cf', 1, 6 ); private final static Mora HI = new Mora( "hi", '\u3072', '\u30d2', 2, 6 ); private final static Mora HU = new Mora( "hu", '\u3075', '\u30d5', 3, 6 ); private final static Mora HE = new Mora( "he", '\u3078', '\u30d8', 4, 6 ); private final static Mora HO = new Mora( "ho", '\u307b', '\u30db', 5, 6 ); // column 7: m private final static Mora MA = new Mora( "ma", '\u307e', '\u30de', 1, 7 ); private final static Mora MI = new Mora( "mi", '\u307f', '\u30df', 2, 7 ); private final static Mora MU = new Mora( "mu", '\u3080', '\u30e0', 3, 7 ); private final static Mora ME = new Mora( "me", '\u3081', '\u30e1', 4, 7 ); private final static Mora MO = new Mora( "mo", '\u3082', '\u30e2', 5, 7 ); // column 8: y private final static Mora YA = new Mora( "ya", '\u3084', '\u30e4', 1, 8 ); private final static Mora YU = new Mora( "yu", '\u3086', '\u30e6', 3, 8 ); private final static Mora YO = new Mora( "yo", '\u3088', '\u30e8', 5, 8 ); // column 9: r private final static Mora RA = new Mora( "ra", '\u3089', '\u30e9', 1, 9 ); private final static Mora RI = new Mora( "ri", '\u308a', '\u30ea', 2, 9 ); private final static Mora RU = new Mora( "ru", '\u308b', '\u30eb', 3, 9 ); private final static Mora RE = new Mora( "re", '\u308c', '\u30ec', 4, 9 ); private final static Mora RO = new Mora( "ro", '\u308d', '\u30ed', 5, 9 ); // column 10: w private final static Mora WA = new Mora( "wa", '\u308f', '\u30ef', 1, 10 ); private final static Mora WO = new Mora( "wo", '\u3092', '\u30f2', 5, 10 ); // column 11: n (singular) private final static Mora N = new Mora( "n", '\u3093', '\u30f3', 1, 11 ); // Second Table: Diacritics // Dakuon // column 1: g private final static Mora GA = new Mora( "ga", '\u304c', '\u30ac', 1, 1 ); private final static Mora GI = new Mora( "gi", '\u304e', '\u30ae', 2, 1 ); private final static Mora GU = new Mora( "gu", '\u3050', '\u30b0', 3, 1 ); private final static Mora GE = new Mora( "ge", '\u3052', '\u30b2', 4, 1 ); private final static Mora GO = new Mora( "go", '\u3054', '\u30b4', 5, 1 ); // column 2: z private final static Mora ZA = new Mora( "za", '\u3056', '\u30b6', 1, 2 ); private final static Mora ZI = new Mora( "zi", '\u3058', '\u30b8', 2, 2 ); private final static Mora ZU = new Mora( "zu", '\u305a', '\u30ba', 3, 2 ); private final static Mora ZE = new Mora( "ze", '\u305c', '\u30bc', 4, 2 ); private final static Mora ZO = new Mora( "zo", '\u305e', '\u30be', 5, 2 ); // column 3: d private final static Mora DA = new Mora( "da", '\u3060', '\u30c0', 1, 3 ); private final static Mora DE = new Mora( "de", '\u3067', '\u30c7', 4, 3 ); private final static Mora DO = new Mora( "do", '\u3069', '\u30c9', 5, 3 ); // column 4: b private final static Mora BA = new Mora( "ba", '\u3070', '\u30d0', 1, 4 ); private final static Mora BI = new Mora( "bi", '\u3073', '\u30d3', 2, 4 ); private final static Mora BU = new Mora( "bu", '\u3076', '\u30d6', 3, 4 ); private final static Mora BE = new Mora( "be", '\u3079', '\u30d9', 4, 4 ); private final static Mora BO = new Mora( "bo", '\u307c', '\u30dc', 5, 4 ); // HanDakuon // column 5: p private final static Mora PA = new Mora( "pa", '\u3071', '\u30d1', 1, 5 ); private final static Mora PI = new Mora( "pi", '\u3074', '\u30d4', 2, 5 ); private final static Mora PU = new Mora( "pu", '\u3077', '\u30d7', 3, 5 ); private final static Mora PE = new Mora( "pe", '\u307a', '\u30da', 4, 5 ); private final static Mora PO = new Mora( "po", '\u307d', '\u30dd', 5, 5 ); // Third Table: Consonant + y + vowel // YoonSeion // column 1: ky private final static Mora KYA = new Mora( "kya", '\u304d', '\u30ad', 1, 1 ); private final static Mora KYU = new Mora( "kyu", '\u304d', '\u30ad', 3, 1 ); private final static Mora KYO = new Mora( "kyo", '\u304d', '\u30ad', 5, 1 ); // column 2: sy private final static Mora SYA = new Mora( "sya", '\u3057', '\u30b7', 1, 2 ); private final static Mora SYU = new Mora( "syu", '\u3057', '\u30b7', 3, 2 );

private final static Mora SYO = new Mora( "syo", '\u3057', '\u30b7', 5, 2 ); // column 3: ty private final static Mora TYA = new Mora( "tya", '\u3061', '\u30c1', 1, 3 ); private final static Mora TYU = new Mora( "tyu", '\u3061', '\u30c1', 3, 3 ); private final static Mora TYO = new Mora( "tyo", '\u3061', '\u30c1', 5, 3 ); // column 4: ny private final static Mora NYA = new Mora( "nya", '\u306b', '\u30cb', 1, 4 ); private final static Mora NYU = new Mora( "nyu", '\u306b', '\u30cb', 3, 4 ); private final static Mora NYO = new Mora( "nyo", '\u306b', '\u30cb', 5, 4 ); // column 5: hy private final static Mora HYA = new Mora( "hya", '\u3072', '\u30d2', 1, 5 ); private final static Mora HYU = new Mora( "hyu", '\u3072', '\u30d2', 3, 5 ); private final static Mora HYO = new Mora( "hyo", '\u3072', '\u30d2', 5, 5 ); // column 6: my private final static Mora MYA = new Mora( "mya", '\u307f', '\u30df', 1, 6 ); private final static Mora MYU = new Mora( "myu", '\u307f', '\u30df', 3, 6 ); private final static Mora MYO = new Mora( "myo", '\u307f', '\u30df', 5, 6 ); // column 7: ry private final static Mora RYA = new Mora( "rya", '\u308a', '\u30ea', 1, 7 ); private final static Mora RYU = new Mora( "ryu", '\u308a', '\u30ea', 3, 7 ); private final static Mora RYO = new Mora( "ryo", '\u308a', '\u30ea', 5, 7 ); // Fourth Table: Consonant with diacritics + Y + vowel // YoonDakuon // column 1: gy private final static Mora GYA = new Mora( "gya", '\u304e', '\u30ae', 1, 1 ); private final static Mora GYU = new Mora( "gyu", '\u304e', '\u30ae', 3, 1 ); private final static Mora GYO = new Mora( "gyo", '\u304e', '\u30ae', 5, 1 ); // column 2: zy private final static Mora ZYA = new Mora( "zya", '\u3058', '\u30b8', 1, 2 ); private final static Mora ZYU = new Mora( "zyu", '\u3058', '\u30b8', 3, 2 ); private final static Mora ZYO = new Mora( "zyo", '\u3058', '\u30b8', 5, 2 ); // column 3: by private final static Mora BYA = new Mora( "bya", '\u3073', '\u30d3', 1, 3 ); private final static Mora BYU = new Mora( "byu", '\u3073', '\u30d3', 3, 3 ); private final static Mora BYO = new Mora( "byo", '\u3073', '\u30d3', 5, 3 ); // YoonHanDakuon // column 4: py private final static Mora PYA = new Mora( "pya", '\u3074', '\u30d4', 1, 4 ); private final static Mora PYU = new Mora( "pyu", '\u3074', '\u30d4', 3, 4 ); private final static Mora PYO = new Mora( "pyo", '\u3074', '\u30d4', 5, 4 ); // mora data structures private Mora[] seionarray = { N, WA, RA, YA, MA, HA, NA, TA, SA, KA, A, RI, MI, HI, NI, TI, SI, KI, I, RU, YU, MU, HU, NU, TU, SU, KU, U, RE, ME, HE, NE, TE, SE, KE, E, WO, RO, YO, MO, HO, NO, TO, SO, KO, O ; private Mora[] dakuonarray = { PA, BA, DA, ZA, GA, PI, BI, ZI, GI, PU, BU, ZU, GU, PE, BE, DE, ZE, GE, PO, BO, DO, ZO, GO ; private Mora[] yoonseionarray = { RYA, MYA, HYA, NYA, TYA, SYA, KYA, RYU, MYU, HYU, NYU, TYU, SYU, KYU, RYO, MYO, HYO, NYO, TYO, SYO, KYO ; private Mora[] yoondakuonarray = { PYA, BYA, ZYA, GYA, PYU, BYU, ZYU, GYU, PYO, BYO, ZYO, GYO ; private Mora[] gozyuuonarray = { N, WA, RA, YA, MA, HA, NA, TA, SA, KA, A, null, null, RI, null, MI, HI, NI, TI, SI, KI, I, null, null, RU, YU, MU, HU, NU, TU, SU, KU, U, null, null, RE, null, ME, HE, NE, TE, SE, KE, E, null, WO, RO, YO, MO, HO, NO, TO, SO, KO, O ; private java.util.list<moracheckbox> moracheckboxlist = new java.util.arraylist<moracheckbox>();

// Mora variables private Mora randommora; private Map moratable = new HashMap(200); private Map legalmoratable = new HashMap(200); private java.util.list moralist; private int index; // value to be guessed // set of mora to be drilled on // set of all mora for input error checking // List construct used to iterate through mora elements // indicated current location within List /** Creates new form MoraDrill */ public MoraDrill() { initcomponents(); this.setlocationrelativeto(null); // center window on screen // import the "typeset" and "brushstroke" Unicode fonts. // Both TrueType fonts obtained via download from the Epson Japan web site: // http://www.i-love-epson.co.jp/download2/printer/driver/win/page/ttf30.htm // For access in English, along with examples of the various fonts available, visit: // http://www.wazu.jp/gallery/fonts_japanese.html try { // import "typeset"-type font InputStream fontstream = MoraDrill.class.getResourceAsStream("epkgobld.ttf"); Font onepoint = Font.createFont( Font.TRUETYPE_FONT, fontstream ); fontstream.close(); typesetfont = onepoint.derivefont( Font.PLAIN, 200 ); // import "brushstroke"-type font fontstream = MoraDrill.class.getResourceAsStream("epminbld.ttf"); onepoint = Font.createFont( Font.TRUETYPE_FONT, fontstream ); fontstream.close(); brushstrokefont = onepoint.derivefont( Font.PLAIN, 200 ); catch (Exception e) {; // default is the typeset font displaylabel.setfont(typesetfont); // create hash table containing all mora for checking legality of // romanization inputs for (int j = 0; j < seionarray.length; j++ ) { legalmoratable.put(seionarray[j].getromanization(), seionarray[j]); for (int j = 0; j < dakuonarray.length; j++ ) { legalmoratable.put(dakuonarray[j].getromanization(), dakuonarray[j]); for (int j = 0; j < yoonseionarray.length; j++ ) { legalmoratable.put(yoonseionarray[j].getromanization(), yoonseionarray[j]); for (int j = 0; j < yoondakuonarray.length; j++ ) { legalmoratable.put(yoondakuonarray[j].getromanization(), yoondakuonarray[j]); // populate default list of mora to drill on populatemoralist(); // populate morapanel with individually selectable mora from the gozyuuon for ( Mora m: gozyuuonarray ) { if ( m == null ) { MoraCheckBox mcb = new MoraCheckBox( null ); mcb.setenabled( false ); mcb.setopaque( true ); morapanel.add( mcb ); else { MoraCheckBox mcb = new MoraCheckBox( m ); morapanel.add( mcb ); moracheckboxlist.add( mcb ); // be nice to the user by setting the focus in the text field, // then display the first mora displaynextmora(); /** * populatemoralist - uses the current selection of menu item check boxes * to set up the list of mora for drilling. */

private void populatemoralist() { // first, clear out whatever is currently in the drill table moratable.clear(); // check the status of each menu item check box; if selected, then add // the appropriate contents to the table. if ( seioncheckboxmenuitem.isselected() ) { for (int j = 0; j < seionarray.length; j++ ) { moratable.put(seionarray[j].getromanization(), seionarray[j]); if ( dakuoncheckboxmenuitem.isselected() ) { for (int j = 0; j < dakuonarray.length; j++ ) { moratable.put(dakuonarray[j].getromanization(), dakuonarray[j]); if ( yoonseioncheckboxmenuitem.isselected() ) { for (int j = 0; j < yoonseionarray.length; j++ ) { moratable.put(yoonseionarray[j].getromanization(), yoonseionarray[j]); if ( yoondakuoncheckboxmenuitem.isselected() ) { for (int j = 0; j < yoondakuonarray.length; j++ ) { moratable.put(yoondakuonarray[j].getromanization(), yoondakuonarray[j]); moralist = new ArrayList( moratable.values() ); Collections.shuffle(moraList); index = 0; private void displaynextmora() { // ensure that there is first something to display... if ( moralist.isempty() ) { JOptionPane.showMessageDialog(MoraDrill.this, "You have no mora selected for display.", "MoraDrill - Error Message", JOptionPane.ERROR_MESSAGE); return; // get the next mora for display; recycle the list elements if all have been used. randommora = (Mora) moralist.get(index++); if ( index >= moralist.size() ) { Collections.shuffle(moraList); index = 0; // determine whether to show the katakana or hiragama form of the mora if (usescripttype.equals(scripttype.hiragana)) displaylabel.settext( randommora.gethiraganastring() ); if (usescripttype.equals(scripttype.katakana)) displaylabel.settext( randommora.getkatakanastring() ); /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="generated Code"> private void initcomponents() { moratypebuttongroup = new javax.swing.buttongroup(); fontbuttongroup = new javax.swing.buttongroup(); moraselectionbuttongroup = new javax.swing.buttongroup(); soundbuttongroup = new javax.swing.buttongroup(); displaylabel = new javax.swing.jlabel(); inputtextfield = new javax.swing.jtextfield(); resultlabel = new javax.swing.jlabel(); revealanswerbutton = new javax.swing.jbutton(); jlabel1 = new javax.swing.jlabel(); morapanel = new javax.swing.jpanel(); jlabel2 = new javax.swing.jlabel(); selectmorabutton = new javax.swing.jbutton(); clearmoracheckboxbutton = new javax.swing.jbutton(); setmoracheckboxbutton = new javax.swing.jbutton();

null)); jmenubar1 = new javax.swing.jmenubar(); filemenu = new javax.swing.jmenu(); exitmenuitem = new javax.swing.jmenuitem(); optionsmenu = new javax.swing.jmenu(); katakanaradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); hiraganaradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); jseparator1 = new javax.swing.jseparator(); jmenu1 = new javax.swing.jmenu(); seioncheckboxmenuitem = new javax.swing.jcheckboxmenuitem(); dakuoncheckboxmenuitem = new javax.swing.jcheckboxmenuitem(); yoonseioncheckboxmenuitem = new javax.swing.jcheckboxmenuitem(); yoondakuoncheckboxmenuitem = new javax.swing.jcheckboxmenuitem(); jseparator2 = new javax.swing.jseparator(); typedfontradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); brushstrokefontradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); jseparator3 = new javax.swing.jseparator(); soundmenu = new javax.swing.jmenu(); muteradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); correctradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); incorrectradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); alwaysradiobuttonmenuitem = new javax.swing.jradiobuttonmenuitem(); helpmenu = new javax.swing.jmenu(); usingmenuitem = new javax.swing.jmenuitem(); aboutmenuitem = new javax.swing.jmenuitem(); setdefaultcloseoperation(javax.swing.windowconstants.exit_on_close); settitle("japanese Mora Drill"); displaylabel.setbackground(new java.awt.color(255, 255, 255)); displaylabel.sethorizontalalignment(javax.swing.swingconstants.center); displaylabel.setborder(javax.swing.borderfactory.createetchedborder()); displaylabel.setopaque(true); inputtextfield.setfont(new java.awt.font("tahoma", 0, 40)); inputtextfield.setmargin(new java.awt.insets(2, 10, 2, 10)); inputtextfield.addactionlistener(new java.awt.event.actionlistener() { inputtextfieldactionperformed(evt); ); resultlabel.setfont(new java.awt.font("tahoma", 0, 24)); resultlabel.sethorizontalalignment(javax.swing.swingconstants.center); revealanswerbutton.setfont(new java.awt.font("tahoma", 0, 14)); revealanswerbutton.setmnemonic('r'); revealanswerbutton.settext("reveal Answer"); revealanswerbutton.addactionlistener(new java.awt.event.actionlistener() { revealanswerbuttonactionperformed(evt); ); jlabel1.setfont(new java.awt.font("tahoma", 1, 14)); jlabel1.sethorizontalalignment(javax.swing.swingconstants.left); jlabel1.settext("enter Mora:"); morapanel.setbackground(new java.awt.color(204, 204, 255)); morapanel.setborder(javax.swing.borderfactory.createetchedborder(new java.awt.color(51, 204, 255), morapanel.setpreferredsize(new java.awt.dimension(680, 140)); morapanel.setlayout(new java.awt.gridlayout(5, 11, 1, 1)); jlabel2.settext("gozyuuon selection:"); selectmorabutton.settext("select Mora"); selectmorabutton.addactionlistener(new java.awt.event.actionlistener() { selectmorabuttonactionperformed(evt); ); clearmoracheckboxbutton.settext("clear All Checkboxes"); clearmoracheckboxbutton.addactionlistener(new java.awt.event.actionlistener() { clearmoracheckboxbuttonactionperformed(evt); );

setmoracheckboxbutton.settext("set All Checkboxes"); setmoracheckboxbutton.addactionlistener(new java.awt.event.actionlistener() { setmoracheckboxbuttonactionperformed(evt); ); filemenu.settext("file"); exitmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_e, java.awt.event.inputevent.ctrl_mask)); exitmenuitem.settext("exit"); exitmenuitem.addactionlistener(new java.awt.event.actionlistener() { exitmenuitemactionperformed(evt); ); filemenu.add(exitmenuitem); jmenubar1.add(filemenu); optionsmenu.settext("options"); katakanaradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_k, moratypebuttongroup.add(katakanaradiobuttonmenuitem); katakanaradiobuttonmenuitem.setselected(true); katakanaradiobuttonmenuitem.settext("katakana Drill"); katakanaradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { katakanaradiobuttonmenuitemactionperformed(evt); ); optionsmenu.add(katakanaradiobuttonmenuitem); hiraganaradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_h, moratypebuttongroup.add(hiraganaradiobuttonmenuitem); hiraganaradiobuttonmenuitem.settext("hiragana Drill"); hiraganaradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { hiraganaradiobuttonmenuitemactionperformed(evt); ); optionsmenu.add(hiraganaradiobuttonmenuitem); optionsmenu.add(jseparator1); jmenu1.settext("select Mora"); seioncheckboxmenuitem.setselected(true); seioncheckboxmenuitem.settext("seion "); seioncheckboxmenuitem.settooltiptext("basic table of mora"); seioncheckboxmenuitem.addactionlistener(new java.awt.event.actionlistener() { seioncheckboxmenuitemactionperformed(evt); ); jmenu1.add(seioncheckboxmenuitem); dakuoncheckboxmenuitem.settext("dakuon and HanDakuon"); dakuoncheckboxmenuitem.settooltiptext("mora with diacritical marks"); dakuoncheckboxmenuitem.addactionlistener(new java.awt.event.actionlistener() { dakuoncheckboxmenuitemactionperformed(evt); ); jmenu1.add(dakuoncheckboxmenuitem); yoonseioncheckboxmenuitem.settext("yoonseion"); yoonseioncheckboxmenuitem.settooltiptext("basic consonant + Y + vowel"); yoonseioncheckboxmenuitem.addactionlistener(new java.awt.event.actionlistener() { yoonseioncheckboxmenuitemactionperformed(evt); ); jmenu1.add(yoonseioncheckboxmenuitem);

yoondakuoncheckboxmenuitem.settext("yoon-d and Yoon-HD"); yoondakuoncheckboxmenuitem.settooltiptext("consonant + Y + vowel with diacritical marks"); yoondakuoncheckboxmenuitem.addactionlistener(new java.awt.event.actionlistener() { yoondakuoncheckboxmenuitemactionperformed(evt); ); jmenu1.add(yoondakuoncheckboxmenuitem); optionsmenu.add(jmenu1); optionsmenu.add(jseparator2); typedfontradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_t, fontbuttongroup.add(typedfontradiobuttonmenuitem); typedfontradiobuttonmenuitem.setselected(true); typedfontradiobuttonmenuitem.settext("show Typed Font"); typedfontradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { typedfontradiobuttonmenuitemactionperformed(evt); ); optionsmenu.add(typedfontradiobuttonmenuitem); brushstrokefontradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_ B, fontbuttongroup.add(brushstrokefontradiobuttonmenuitem); brushstrokefontradiobuttonmenuitem.settext("show Brushstroke Font"); brushstrokefontradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { brushstrokefontradiobuttonmenuitemactionperformed(evt); ); optionsmenu.add(brushstrokefontradiobuttonmenuitem); optionsmenu.add(jseparator3); soundmenu.settext("sound"); muteradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_m, soundbuttongroup.add(muteradiobuttonmenuitem); muteradiobuttonmenuitem.setselected(true); muteradiobuttonmenuitem.settext("mute"); muteradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { muteradiobuttonmenuitemactionperformed(evt); ); soundmenu.add(muteradiobuttonmenuitem); correctradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_c, soundbuttongroup.add(correctradiobuttonmenuitem); correctradiobuttonmenuitem.settext("play only when Correct"); correctradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { correctradiobuttonmenuitemactionperformed(evt); ); soundmenu.add(correctradiobuttonmenuitem); incorrectradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_i, soundbuttongroup.add(incorrectradiobuttonmenuitem); incorrectradiobuttonmenuitem.settext("play only when Incorrect"); incorrectradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { incorrectradiobuttonmenuitemactionperformed(evt); ); soundmenu.add(incorrectradiobuttonmenuitem); alwaysradiobuttonmenuitem.setaccelerator(javax.swing.keystroke.getkeystroke(java.awt.event.keyevent.vk_p,

soundbuttongroup.add(alwaysradiobuttonmenuitem); alwaysradiobuttonmenuitem.settext("always Play"); alwaysradiobuttonmenuitem.addactionlistener(new java.awt.event.actionlistener() { alwaysradiobuttonmenuitemactionperformed(evt); ); soundmenu.add(alwaysradiobuttonmenuitem); optionsmenu.add(soundmenu); jmenubar1.add(optionsmenu); helpmenu.settext("help"); usingmenuitem.settext("using MoraDrill..."); usingmenuitem.addactionlistener(new java.awt.event.actionlistener() { usingmenuitemactionperformed(evt); ); helpmenu.add(usingmenuitem); aboutmenuitem.settext("about MoraDrill..."); aboutmenuitem.addactionlistener(new java.awt.event.actionlistener() { aboutmenuitemactionperformed(evt); ); helpmenu.add(aboutmenuitem); jmenubar1.add(helpmenu); setjmenubar(jmenubar1); javax.swing.grouplayout layout = new javax.swing.grouplayout(getcontentpane()); getcontentpane().setlayout(layout); layout.sethorizontalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.trailing, false).addgroup(javax.swing.grouplayout.alignment.leading, layout.createsequentialgroup().addgap(13, 13, 13).addComponent(resultLabel, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE)).addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createsequentialgroup().addcontainergap().addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addcomponent(displaylabel, javax.swing.grouplayout.preferred_size, 406, javax.swing.grouplayout.preferred_size).addpreferredgap(javax.swing.layoutstyle.componentplacement.related)).addcomponent(jlabel1, javax.swing.grouplayout.preferred_size, 82, javax.swing.grouplayout.preferred_size).addpreferredgap(javax.swing.layoutstyle.componentplacement.related).addcomponent(inputtextfield, javax.swing.grouplayout.preferred_size, 126, javax.swing.grouplayout.preferred_size).addpreferredgap(javax.swing.layoutstyle.componentplacement.related, javax.swing.grouplayout.default_size, Short.MAX_VALUE).addComponent(revealAnswerButton, javax.swing.grouplayout.preferred_size, 123, javax.swing.grouplayout.preferred_size))))).addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgap(18, 18, 18).addComponent(jLabel2)).addGap(18, 18, 18).addComponent(selectMoraButton).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 107, Short.MAX_VALUE).addComponent(clearMoraCheckBoxButton).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(setMoraCheckBoxButton)).addGap(16, 16, 16).addComponent(moraPanel, javax.swing.grouplayout.default_size, 460, Short.MAX_VALUE))).addContainerGap()) );

layout.setverticalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addcontainergap().addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addcomponent(jlabel2).addpreferredgap(javax.swing.layoutstyle.componentplacement.related).addcomponent(morapanel, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addpreferredgap(javax.swing.layoutstyle.componentplacement.related).addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.baseline).addcomponent(selectmorabutton).addcomponent(setmoracheckboxbutton).addcomponent(clearmoracheckboxbutton))).addcomponent(displaylabel, javax.swing.grouplayout.preferred_size, 272, javax.swing.grouplayout.preferred_size).addpreferredgap(javax.swing.layoutstyle.componentplacement.related).addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading, false).addcomponent(jlabel1, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE).addComponent(inputTextField).addComponent(revealAnswerButton, javax.swing.grouplayout.default_size, 71, Short.MAX_VALUE)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(resultLabel, javax.swing.grouplayout.preferred_size, 38, javax.swing.grouplayout.preferred_size))).addcontainergap(javax.swing.grouplayout.default_size, Short.MAX_VALUE)) ); pack(); // </editor-fold> private void inputtextfieldactionperformed(java.awt.event.actionevent evt) { // get the user's input, then reset the textfield for the next entry String key = inputtextfield.gettext().trim().tolowercase(); inputtextfield.settext( "" ); // Pressing just 'Enter' will advance the display to the next mora if ( key.length() == 0 ) { displaynextmora(); resultlabel.settext( "" ); // erase any message currently shown return; // Allow user to have the correct answer to be displayed. if (key.equals("?")) { resultlabel.settext( "answer is " + randommora ); return; // if here, then determine if the romanization is legal Mora thismora = (Mora) moratable.get( key ); Mora checkmora = (Mora) legalmoratable.get( key ); // checkmora looks the entry up against all mora, regardless of whether // a particular mora is in the current drill list or not. if ( checkmora == null ) { resultlabel.settext( "Illegal Mora" ); return; // If we reach here then we have a legal mora. // thismora is the mora specified by the user - we'll now check it // against the actual mora being displayed... if ( thismora.equals(randommora) ) { resultlabel.settext( thismora + " is correct" ); if ( playifcorrect ) randommora.play(); else { resultlabel.settext( thismora + " is wrong"); if ( playifincorrect ) randommora.play();

private void revealanswerbuttonactionperformed(java.awt.event.actionevent evt) { resultlabel.settext( "answer is " + randommora ); private void exitmenuitemactionperformed(java.awt.event.actionevent evt) { System.exit( 0 ); private void katakanaradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { usescripttype = ScriptType.Katakana; displaylabel.settext(randommora.getkatakanastring()); private void hiraganaradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { usescripttype = ScriptType.Hiragana; displaylabel.settext(randommora.gethiraganastring()); private void typedfontradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { displaylabel.setfont(typesetfont); private void brushstrokefontradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { displaylabel.setfont(brushstrokefont); private void muteradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { playifcorrect = false; playifincorrect = false; private void correctradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { playifcorrect = true; playifincorrect = false; private void incorrectradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { playifcorrect = false; playifincorrect = true; private void alwaysradiobuttonmenuitemactionperformed(java.awt.event.actionevent evt) { playifcorrect = true; playifincorrect = true; private void aboutmenuitemactionperformed(java.awt.event.actionevent evt) { AboutDialog d = new AboutDialog( MoraDrill.this, true ); private void seioncheckboxmenuitemactionperformed(java.awt.event.actionevent evt) { populatemoralist(); private void dakuoncheckboxmenuitemactionperformed(java.awt.event.actionevent evt) { populatemoralist(); private void yoonseioncheckboxmenuitemactionperformed(java.awt.event.actionevent evt) { populatemoralist(); private void yoondakuoncheckboxmenuitemactionperformed(java.awt.event.actionevent evt) { populatemoralist(); private void selectmorabuttonactionperformed(java.awt.event.actionevent evt) { moratable.clear(); Iterator<MoraCheckBox> mcbiterator = moracheckboxlist.iterator(); while (mcbiterator.hasnext()) {

MoraCheckBox mcb = mcbiterator.next(); if ( mcb.isselected() ) { Mora thismora = mcb.getmora(); moratable.put(thismora.getromanization(), thismora ); moralist = new ArrayList( moratable.values() ); Collections.shuffle(moraList); index = 0; private void clearmoracheckboxbuttonactionperformed(java.awt.event.actionevent evt) { Iterator<MoraCheckBox> mcbiterator = moracheckboxlist.iterator(); while (mcbiterator.hasnext()) { MoraCheckBox mcb = mcbiterator.next(); mcb.setselected( false ); private void setmoracheckboxbuttonactionperformed(java.awt.event.actionevent evt) { Iterator<MoraCheckBox> mcbiterator = moracheckboxlist.iterator(); while (mcbiterator.hasnext()) { MoraCheckBox mcb = mcbiterator.next(); mcb.setselected( true ); private void usingmenuitemactionperformed(java.awt.event.actionevent evt) { InstructionsDialog d = new InstructionsDialog( MoraDrill.this, true ); /** * @param args the command line arguments */ public static void main(string args[]) { java.awt.eventqueue.invokelater(new Runnable() { public void run() { new MoraDrill().setVisible(true); ); // Variables declaration - do not modify private javax.swing.jmenuitem aboutmenuitem; private javax.swing.jradiobuttonmenuitem alwaysradiobuttonmenuitem; private javax.swing.jradiobuttonmenuitem brushstrokefontradiobuttonmenuitem; private javax.swing.jbutton clearmoracheckboxbutton; private javax.swing.jradiobuttonmenuitem correctradiobuttonmenuitem; private javax.swing.jcheckboxmenuitem dakuoncheckboxmenuitem; private javax.swing.jlabel displaylabel; private javax.swing.jmenuitem exitmenuitem; private javax.swing.jmenu filemenu; private javax.swing.buttongroup fontbuttongroup; private javax.swing.jmenu helpmenu; private javax.swing.jradiobuttonmenuitem hiraganaradiobuttonmenuitem; private javax.swing.jradiobuttonmenuitem incorrectradiobuttonmenuitem; private javax.swing.jtextfield inputtextfield; private javax.swing.jlabel jlabel1; private javax.swing.jlabel jlabel2; private javax.swing.jmenu jmenu1; private javax.swing.jmenubar jmenubar1; private javax.swing.jseparator jseparator1; private javax.swing.jseparator jseparator2; private javax.swing.jseparator jseparator3; private javax.swing.jradiobuttonmenuitem katakanaradiobuttonmenuitem; private javax.swing.jpanel morapanel; private javax.swing.buttongroup moraselectionbuttongroup; private javax.swing.buttongroup moratypebuttongroup; private javax.swing.jradiobuttonmenuitem muteradiobuttonmenuitem; private javax.swing.jmenu optionsmenu; private javax.swing.jlabel resultlabel; private javax.swing.jbutton revealanswerbutton; private javax.swing.jcheckboxmenuitem seioncheckboxmenuitem; private javax.swing.jbutton selectmorabutton; private javax.swing.jbutton setmoracheckboxbutton; private javax.swing.buttongroup soundbuttongroup;

private javax.swing.jmenu soundmenu; private javax.swing.jradiobuttonmenuitem typedfontradiobuttonmenuitem; private javax.swing.jmenuitem usingmenuitem; private javax.swing.jcheckboxmenuitem yoondakuoncheckboxmenuitem; private javax.swing.jcheckboxmenuitem yoonseioncheckboxmenuitem; // End of variables declaration