Korzystanie z klasy IME

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Klasa IME umożliwia manipulowanie edytorem IME systemu operacyjnego w programie Flash Player lub środowisku Adobe AIR.

Z poziomu kodu ActionScript można uzyskać następujące informacje:

  • czy na komputerze użytkownika jest zainstalowany edytor IME ( Capabilities.hasIME );

  • czy edytor IME na komputerze użytkownika jest włączony, czy wyłączony IME.enabled );

  • jakiego trybu konwersji używa bieżący edytor IME ( IME.conversionMode ).

Istnieje możliwość skojarzenia pola tekstu wejściowego z konkretnym kontekstem edytora IME. Przełączaniu między polami wejściowymi może towarzyszyć przełączanie edytora IME między trybem Hiragana (jęz. japoński), liczbami o pełnej szerokości, liczbami o połówkowej szerokości, trybem wprowadzania bezpośredniego itd.

Edytor IME umożliwia użytkownikom wpisywanie znaków tekstu niebędących znakami ASCII, w szczególności w językach wielobajtowych, takich jak chiński, japoński i koreański.

Więcej informacji na temat pracy z edytorami IME zawiera dokumentacja systemu operacyjnego, dla którego tworzona jest aplikacja. Dodatkowe zasoby są dostępne w następujących witrynach sieci Web:

Uwaga: Jeśli edytor IME nie jest aktywny na komputerze użytkownika, wywołania metod lub właściwości IME innych niż Capabilities.hasIME zakończą się niepowodzeniem. Po ręcznym aktywowaniu edytora IME wywołania ActionScript dotyczące metod i właściwości IME będą działały zgodnie z oczekiwaniami. Na przykład, jeśli używamy edytora IME dla języka japońskiego, musimy go aktywować zanim przed pierwszym odwołaniem do jakiejkolwiek metody lub właściwości IME.

Sprawdzanie, czy edytor IME jest zainstalowany i włączony

Przed wywołaniem jakichkolwiek metod lub właściwości edytora IME należy zawsze sprawdzić, czy na komputerze użytkownika jest zainstalowany i włączony edytor IME. Poniższy przykład ilustruje sprawdzanie, czy edytor IME na komputerze użytkownika jest zainstalowany i aktywny:

if (Capabilities.hasIME) 
{ 
    if (IME.enabled) 
    { 
        trace("IME is installed and enabled."); 
    } 
    else 
    { 
        trace("IME is installed but not enabled. Please enable your IME and try again."); 
    } 
} 
else 
{ 
    trace("IME is not installed. Please install an IME and try again."); 
}

Poprzedni kod najpierw sprawdza, czy użytkownik ma zainstalowany edytor IME. Odczytywana jest w tym celu właściwość Capabilities.hasIME . Jeśli ta właściwość ma wartość true , kod sprawdza, czy edytor IME użytkownika jest włączony, odczytując właściwość IME.enabled .

Określanie, jaki tryb konwersji edytora IME jest włączony

W aplikacjach wielojęzycznych zachodzi czasem konieczność sprawdzenia, który tryb konwersji jest w danej chwili aktywny. Poniższy kod ilustruje sposób sprawdzenia, czy użytkownik ma zainstalowany edytor IME, a jeśli tak, to który tryb konwersji edytora IME jest obecnie aktywny:

if (Capabilities.hasIME) 
{ 
    switch (IME.conversionMode) 
    { 
        case IMEConversionMode.ALPHANUMERIC_FULL: 
            tf.text = "Current conversion mode is alphanumeric (full-width)."; 
            break; 
        case IMEConversionMode.ALPHANUMERIC_HALF: 
            tf.text = "Current conversion mode is alphanumeric (half-width)."; 
            break; 
        case IMEConversionMode.CHINESE: 
            tf.text = "Current conversion mode is Chinese."; 
            break; 
        case IMEConversionMode.JAPANESE_HIRAGANA: 
            tf.text = "Current conversion mode is Japananese Hiragana."; 
            break; 
        case IMEConversionMode.JAPANESE_KATAKANA_FULL: 
            tf.text = "Current conversion mode is Japanese Katakana (full-width)."; 
            break; 
        case IMEConversionMode.JAPANESE_KATAKANA_HALF: 
            tf.text = "Current conversion mode is Japanese Katakana (half-width)."; 
            break; 
        case IMEConversionMode.KOREAN: 
            tf.text = "Current conversion mode is Korean."; 
            break; 
        default: 
            tf.text = "Current conversion mode is " + IME.conversionMode + "."; 
            break; 
    } 
} 
else 
{ 
    tf.text = "Please install an IME and try again."; 
}

Powyższy kod najpierw sprawdza, czy użytkownik ma zainstalowany edytor IME. Następnie sprawdza, który tryb konwersji obowiązuje obecnie w edytorze IME, porównując właściwość IME.conversionMode z poszczególnymi stałymi w klasie IMEConversionMode.

Ustawianie trybu konwersji edytora IME

Operację zmiany trybu konwersji edytora IME użytkownika należy zawsze ujmować w blok try..catch , ponieważ ustawienie trybu za pomocą właściwości conversionMode spowoduje zgłoszenie błędu, jeśli edytor IME nie będzie w stanie włączyć żądanego trybu. Poniższy kod demonstruje sposób użycia bloku try..catch do ustawiania właściwości IME.conversionMode :

var statusText:TextField = new TextField; 
statusText.autoSize = TextFieldAutoSize.LEFT; 
addChild(statusText); 
if (Capabilities.hasIME) 
{ 
    try 
    { 
        IME.enabled = true; 
        IME.conversionMode = IMEConversionMode.KOREAN; 
        statusText.text = "Conversion mode is " + IME.conversionMode + "."; 
    } 
    catch (error:Error) 
    { 
        statusText.text = "Unable to set conversion mode.\n" + error.message; 
    } 
}

Kod w powyższym przykładzie najpierw tworzy pole tekstowe, które służy do wyświetlania komunikatu o statusie. Następnie, jeśli edytor IME jest zainstalowany, kod włącza edytor IME i ustawia tryb konwersji na język koreański. Jeśli na komputerze użytkownika nie ma zainstalowanego edytora IME dla języka koreańskiego, program Flash Player lub środowisko AIR zgłasza błąd, który zostanie przechwycony przez blok try..catch wygenerowany zostanie obiekt ApplicationError. Instrukcja bloku try..catch wyświetla komunikat o błędzie w utworzonym wcześniej polu tekstowym.

Wyłączanie edytora IME dla określonych pól tekstowych

W niektórych przypadkach wskazane jest wyłączenie edytora IME użytkownika na czas wpisywania znaków. Przykładowo, jeśli mamy pole tekstowe przyjmujące tylko dane liczbowe, niecelowe jest wywoływanie edytora IME, który będzie tylko utrudniał wprowadzanie danych.

Poniższy przykład ilustruje wyłączanie edytora IME użytkownika w odpowiedzi na zdarzenia FocusEvent.FOCUS_IN i FocusEvent.FOCUS_OUT :

var phoneTxt:TextField = new TextField(); 
var nameTxt:TextField = new TextField(); 
 
phoneTxt.type = TextFieldType.INPUT; 
phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler); 
phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler); 
phoneTxt.restrict = "0-9"; 
phoneTxt.width = 100; 
phoneTxt.height = 18; 
phoneTxt.background = true; 
phoneTxt.border = true; 
addChild(phoneTxt); 
 
nameField.type = TextFieldType.INPUT; 
nameField.x = 120; 
nameField.width = 100; 
nameField.height = 18; 
nameField.background = true; 
nameField.border = true; 
addChild(nameField); 
 
function focusInHandler(event:FocusEvent):void 
{ 
    if (Capabilities.hasIME) 
    { 
        IME.enabled = false; 
    } 
} 
function focusOutHandler(event:FocusEvent):void 
{ 
    if (Capabilities.hasIME) 
    { 
        IME.enabled = true; 
    } 
}

W przykładzie tym tworzone są dwa pola tekstowe, phoneTxt oraz nameTxt , a następnie do pola tekstowego phoneTxt dodawane są dwa detektory zdarzeń. Gdy użytkownik aktywuje pole tekstowe phoneTxt , wywoływane jest zdarzenie FocusEvent.FOCUS_IN i edytor IME zostaje wyłączony. Gdy pole phoneTxt przestaje być aktywne, wywoływane jest zdarzenie FocusEvent.FOCUS_OUT powodujące włączenie edytora IME.

Wykrywanie zdarzeń kompozycji z edytora IME

Zdarzenia kompozycji edytora IME są wywoływane w trakcie zestawiania ciągu znaków kompozycji/ Na przykład, jeśli użytkownik ma włączony i aktywny edytor IME i wpisuje ciąg znaków w języku japońskim, zdarzenie IMEEvent.IME_COMPOSITION zostanie wywołane niezwłocznie po tym, jak użytkownik wybierze ciąg znaków kompozycji. Aby wykrywać zdarzenie IMEEvent.IME_COMPOSITION , należy dodać detektor zdarzenia do statycznej właściwości ime w klasie System ( flash.system.System.ime.addEventListener(...) ), tak jak ilustruje to poniższy przykład

var inputTxt:TextField; 
var outputTxt:TextField; 
 
inputTxt = new TextField(); 
inputTxt.type = TextFieldType.INPUT; 
inputTxt.width = 200; 
inputTxt.height = 18; 
inputTxt.border = true; 
inputTxt.background = true; 
addChild(inputTxt); 
 
outputTxt = new TextField(); 
outputTxt.autoSize = TextFieldAutoSize.LEFT; 
outputTxt.y = 20; 
addChild(outputTxt); 
 
if (Capabilities.hasIME) 
{ 
    IME.enabled = true; 
    try 
    { 
        IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA; 
    } 
    catch (error:Error) 
    { 
        outputTxt.text = "Unable to change IME."; 
    } 
    System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler); 
} 
else 
{ 
    outputTxt.text = "Please install IME and try again."; 
} 
 
function imeCompositionHandler(event:IMEEvent):void 
{ 
    outputTxt.text = "you typed: " + event.text; 
}

Powyższy kod tworzy dwa pola tekstowe i dodaje je do listy wyświetlania. Pierwsze pole tekstowe, inputTxt , to pole tekstu wejściowego, które umożliwia użytkownikowi wprowadzanie tekstu w języku japońskim. Drugie pole tekstowe, outputTxt , to pole dynamiczne, w którym wyświetlane są komunikaty o błędach lub replika japońskiego ciągu znaków wpisywanego w polu tekstowym inputTxt .