package elte.java2_utikalauz5.gui; /** Példaprogram magyar ékezetes betűk megadására beviteli módszer segítségével. Egy olyan beviteli módszert valósítunk meg, amely a repülő ékezetes írásmódot támogatja: bármely magánhangzót leütve belépünk a szövegszerkesztési módba, ahol egyszeri idézőjelet megadva (vagy csak Enter-t nyomva) a magánhangzó hosszú változatát, kettőspont vagy dupla idézőjel hatására pedig a duplapontos (például ö) és duplahosszú (például ű) változatát kapjuk. A bevitel megkönnyítése érdekében szerkesztés alatt egy ablakot is megjelenítünk, amelyen nyomógombok segítségével végezhető el adott ékezetes betű gyors bevitele. A szerkesztési módból az Esc billentyű, vagy bármely, ékezetes betűt nem eredményező karakter hatására kiléphetünk. A szerkesztési mód eléréséhez telepítsük a csomagot a JRE/lib/ext könyvtárba! @link.forrásfájl {@docRoot}/../data/gui/src IMTeszt.java @link.letöltés {@docRoot}/../data/gui IMTeszt.jar @see java.awt.im.spi @since Java 2 Útikalauz programozóknak 5.0 */ public class IMTeszt extends DnDTeszt implements java.awt.im.spi.InputMethod, java.awt.event.ActionListener { /** A bevitelt megkezdő magánhangzó indexe, -1 ha nincs bevitel */ private int betűindex = -1; /** Bevitelt kezdő magánhangzók */ private static final String BETŰK = "aAeEiIoOuU"; /** Megfelelő hosszú magánhangzók */ private static final String HOSSZÚBETŰK = "áÁéÉíÍóÓúÚ"; /** Megfelelő duplapontos magánhangzók */ private static final String PONTOSBETŰK = " öÖüÜ"; /** Megfelelő duplahosszú magánhangzók */ private static final String HOSSZÚPONTOSBETŰK = " őŐűŰ"; /** GUI-t felépítő konstruktor. @param felület a felhasználói felületet tartalmazó konténer */ IMTeszt( java.awt.Container felület ) { super( felület ); //igény esetén a felület felépítése if (felület!=null) felület.add(java.awt.BorderLayout.SOUTH, new javax.swing.JTextArea(5, 1)); } /** A grafikus felhasználói felület felépítése. @param felület A felhasználói felületet tartalmazó konténer. @param argumentumok Az indításkor megadott paraméterek. */ public static void felépít(java.awt.Container felület, String argumentumok[]) { new IMTeszt( felület ); //felület felépítése } /** A tesztprogram indítása. @param argumentumok Az indításkor megadott paraméterek. */ public static void main(String argumentumok[]) { java.awt.Frame ablak = new AblakTeszt.Ablak("Adatbeviteli teszt"); felépít( ablak, argumentumok ); //felület felépítése ablak.setVisible(true); //és megjelenítése } /*********** Ékezetes betűk beviteli módszerének leíróosztálya ************/ public static class Leiro implements java.awt.im.spi.InputMethodDescriptor { static { java.util.prefs.Preferences prefs = java.util.prefs.Preferences. userRoot().node("/java/awt/im/selectionKey"); int menübillentyű = prefs.getInt("keyCode", 0);//módszermenü előhívó int menümódosító = prefs.getInt("modifiers", 0); //billentyűkód if (menübillentyű == 0) { //ha nincs megadva, saját kód beállítása prefs.putInt("keyCode", menübillentyű = java.awt.event.KeyEvent. VK_F4); prefs.putInt("modifiers",menümódosító=java.awt.event.InputEvent. SHIFT_MASK); } System.out.println("Beviteli módszermenü billentyűkombinációja: " + java.awt.event.KeyEvent.getKeyModifiersText(menümódosító) + " "+ java.awt.event.KeyEvent.getKeyText(menübillentyű)); } /** Beviteli metódus megvalósítás példányosítása. @return új beviteli módszer megvalósítás */ public java.awt.im.spi.InputMethod createInputMethod() { return new IMTeszt(null); } /** A támogatott nemzetközi környezetek lekérdezése. @return a támogatott nemzetköszi környezet objektumok tömbje */ public java.util.Locale[] getAvailableLocales() { return new java.util.Locale[] { new java.util.Locale("","",""), //a módszer mindig használható }; } /** A beviteli módszer nevének lekérdezése. @param környezet a beviteli módszer alkalmazásának nemzetközi környezete @param nyelv a beviteli módszernév megjelenítésének nyelve @return a beviteli módszer neve */ public String getInputMethodDisplayName(java.util.Locale környezet, java.util.Locale nyelv) { return "Teszt beviteli módszer (IMTeszt)"; } /** A támogatott nyelvek listája fix. @return {@code false}, mivel minden nyelvet támogatunk */ public boolean hasDynamicLocaleList() { return false; } /** A beviteli módszer ikonjának lekérdezése. @param nyelv a beviteli módszerikon megjelenítésének nyelve @return a beviteli módszer ikonja */ public java.awt.Image getInputMethodIcon(java.util.Locale nyelv) { return null; //nincs ikon } }//************************************************************************* /** Kliens beviteli események feldolgozása @param esemény a klienstől jövő beviteli esemény */ public void dispatchEvent(java.awt.AWTEvent esemény){//csak billentyűesemény if (!(esemény instanceof java.awt.event.KeyEvent)) return; java.awt.event.KeyEvent billentyűesemény = (java.awt.event.KeyEvent)esemény; boolean szerkeszt = betűindex >= 0; //szerkesztési módban vagyunk-e if (esemény.getID() == java.awt.event.KeyEvent.KEY_TYPED) { char karakter = billentyűesemény.getKeyChar(); //billentyűnyomás if (szerkeszt) switch (karakter) { case '\'': case '\n': ékezet(HOSSZÚBETŰK, karakter); //hosszú magánhangzó break; case ':': ékezet(PONTOSBETŰK, karakter); //duplapontozott magánhangzó break; case '"': ékezet(HOSSZÚPONTOSBETŰK,karakter);//duplahosszú magánhangzó break; case '\u007f': case '\b': megjelenít('\u0000', true); //törlés break; default: endComposition(); //nem szerkesztő karakter továbbadása megjelenít(karakter, (betűindex=BETŰK.indexOf(karakter))<0); } else { //magánhangzó esetén belépés szerkesztési módba if ((betűindex = BETŰK.indexOf( karakter )) < 0) return; megjelenít( karakter, false ); } } else if (!szerkeszt) return; //szerkesztéskor a billentyűzetesemények billentyűesemény.consume();//elnyelése, helyettük szerkesztési események } /** Ékezetes betűvé konvertálás, vagy kilépés a szerkesztésből @param betűk az ékezetes konverziós szöveg @param karakter a leütött ékezet */ private void ékezet(String betűk, char karakter) { if (betűk.charAt(betűindex)!=' ') //ékezetessé konvertálás megjelenít(betűk.charAt(betűindex), true); else { //nem támogatott ékezetkombináció továbbadása endComposition(); megjelenít( karakter, true ); } } /** Szöveg megjeleníttetése a kliens komponensben bevteli esemény segítségével. @param karakter a megjelenítendő betű @param végleges igaz értéke esetén a betű bevitele már véglegesítésre került */ private void megjelenít(char karakter, boolean végleges) { java.text.AttributedString szöveg = new java.text.AttributedString( karakter=='\u0000' ? "" : String.valueOf(karakter)); if (!végleges) szöveg.addAttribute( //szerkesztési állapot vizualizálása java.awt.font.TextAttribute.INPUT_METHOD_HIGHLIGHT, java.awt.im.InputMethodHighlight.SELECTED_RAW_TEXT_HIGHLIGHT); context.dispatchInputMethodEvent( //beviteli esemény küldése a kliensnek java.awt.event.InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, szöveg.getIterator(), végleges && karakter!='\u0000' ? 1 : 0, java.awt.font.TextHitInfo.leading(karakter=='\u0000' ? 0 : 1),null); if (végleges) hideWindows(); //gyorsbevtieli ablak elrejtése else showWindows(); //illetve szerkesztéskor megjelenítése } /** Beviteli módszer aktiválása */ public void activate() { //naplózás System.out.println(getClass().getSimpleName()+" activálva"); } /** Beviteli módszer deaktválása @param ideiglenes a deaktiválás ideiglenességét adja meg */ public void deactivate(boolean ideiglenes) { hideWindows(); //naplózás System.out.println(getClass().getSimpleName()+" deaktivál "+ideiglenes); } /** A beviteli módszermegvalósítás megszüntetése */ public void dispose() { if (ablak!=null) { //gyorsbeviteli ablak megszüntetése ablak.dispose(); ablak = null; } } /** Nincs saját vezérlőinterfész. @return {@code null}, mivel nincs saját vezérlőinterfész. */ public Object getControlObject() { return null; } /** Kilépés a szerkesztési módból */ public void endComposition(){//eredeti betű szerkesztés nélkül megjelenítése if (betűindex>=0) megjelenít(BETŰK.charAt(betűindex), true); } /** Gyorsbeviteli ablak eltüntetése */ public void hideWindows() { betűindex = -1; //szerkesztés befejezve if (ablak!=null) ablak.setVisible(false); //ablak eltüntetése } /** Gyorsbevitelt lehetővé tevő ablak */ private java.awt.Window ablak; /** Gyorsbeviteli ablak megjelenítése */ public void showWindows() { if (ablak==null) { //az ablak felhasználói felöletének felépítése ablak=context.createInputMethodWindow("Ékezetes karakterek", true); ablak.setLayout(new java.awt.GridLayout(0,2)); String betűk = HOSSZÚBETŰK+PONTOSBETŰK+HOSSZÚPONTOSBETŰK; for (int pozíció=0; pozíció