/* * 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