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ó