Фокус ввода текста Flex - PullRequest
       9

Фокус ввода текста Flex

2 голосов
/ 09 августа 2011

В моем приложении Air у меня 2 проблемы с фокусом. Действительно, когда я пытаюсь переместиться в мою форму с помощью клавиши табуляции, порядок не очень хороший. Во-вторых, граница фокуса не видна, даже если курсор находится на вводе текста.

Найти ниже часть кода

Для перемещения с помощью клавиши табуляции

this.focusManager.activate();
this.focusManager.setFocus(this.fdNom);

Мой TextInput CSS

 s|TextInput 
{
    focusColor: #33CC00;
    color : #343434;
    font-weight : normal;
    font-family: Helvetica ;
    font-size : 12;

}

Моя форма

<s:Form x="0" y="94" id="foPerso" width="100%" height="100%" 
            includeInLayout="true" includeIn="tb1" 
            backgroundColor="#FFFFF">

        <s:layout>
            <s:FormLayout gap="3" paddingLeft="0"/> 

        </s:layout>



        <s:HGroup width="100%" gap="3" horizontalAlign="left" resizeMode="noScale"
                  verticalAlign="baseline" >


            <s:DropDownList id="cbQualite" dataProvider="{DP_PAT_CIVIL}"
                            selectedItem="{getSelectedItem(DP_PAT_CIVIL, objectPatient.paQualPatient)}" 
                            change="objectPatient.paQualPatient = event.currentTarget.selectedItem.label"/>

            <s:FormItem label="Nom" >
                <s:TextInput id="fdNom" width="200" 
                             text="@{objectPatient.paNomU}"

                             />
            </s:FormItem>
            <s:FormItem  label="Prénom" >
                <s:TextInput id="fdPrenom" width="200" text="@{objectPatient.paPrenom}"/>
            </s:FormItem>
            <s:DropDownList id="cbDossier1" dataProvider="{DP_PAT_DOS1}" width="118" height="22" tabIndex="3"
                            change="objectPatient.paQualPatient = event.currentTarget.selectedItem.label"
                            />

            <s:FormItem label="" >
                <s:TextInput id="fDossier1" width="90" paddingRight="5" text="@{objectPatient.paDossier1}"/>
            </s:FormItem>
        </s:HGroup>

Моя форма находится на пользовательском компоненте TitleWindow.

Спасибо за помощь

Ответы [ 4 ]

3 голосов
/ 09 августа 2011

Используйте свойство TextInput tabindex для управления табличным порядком.

0 голосов
/ 10 августа 2011

Я нашел часть решения, но мне нужна ваша помощь, чтобы закончить.

Действительно, с помощью Window Window все работает хорошо, но я создаю свое окно таким образом, и фокус не виден.В чем ошибка?

var wdetcorr:wDetailCorrespondant = new wDetailCorrespondant();
            wdetcorr.monIdCorresp = correspDG.selectedItem.crIndex;

            var wOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
            wOptions.systemChrome = NativeWindowSystemChrome.NONE;
            wOptions.transparent = false;
            var fnwDetailPatient:FlexNativeWindow = new FlexNativeWindow(wdetcorr, wOptions);
            fnwDetailPatient.activate();

И код FlexNativeWindow:

package fr.ui.windowSkin
{
import flash.display.NativeWindow;
    import flash.display.NativeWindowInitOptions;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

import mx.core.IUIComponent;
import mx.core.IVisualElement;
import mx.core.IVisualElementContainer;
import mx.core.UIComponent;
import mx.events.*;
import mx.managers.WindowedSystemManager;

[Event(name="creationComplete", type="mx.events.FlexEvent")]

public class FlexNativeWindow extends NativeWindow implements IFlexNativeWindow
{
    private var _systemManager:WindowedSystemManager;

    private var _content:UIComponent;

    private var _window:IVisualElementContainer;

    public function FlexNativeWindow(window:IVisualElementContainer, initOptions:NativeWindowInitOptions = null)
    {
        super(initOptions);


        _window = window;

        addEventListener(Event.ACTIVATE, windowActivateHandler);

    }

    public function addElement(control:IVisualElement):void
    {
        _window.addElement(control);
    }

    public function removeElement(control:IVisualElement):void
    {
        _window.removeElement(control);
    }

    private function windowActivateHandler(event:Event):void
    {
        event.preventDefault();
        event.stopImmediatePropagation();
        removeEventListener(Event.ACTIVATE, windowActivateHandler);

        if (stage)
        {
            if (!_systemManager)
                _systemManager = new WindowedSystemManager(IUIComponent(_window));

            stage.addChild(_systemManager);

            dispatchEvent(new FlexEvent(FlexEvent.CREATION_COMPLETE));

            stage.addEventListener(Event.RESIZE, windowResizeHandler);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);

        }
    }

    private function keyDownListener (e:KeyboardEvent):void {

        if (e.keyCode == Keyboard.ESCAPE) {
            stage.nativeWindow.dispatchEvent(new Event("myEventClose", true));
            stage.nativeWindow.close();
        }


    }

    private function windowResizeHandler(event:Event):void
    {
        // prise en compte de la valeur mini
        UIComponent(_window).height = stage.stageHeight;
        UIComponent(_window).width = stage.stageWidth;


    }
}

}

0 голосов
/ 09 августа 2011

Flex автоматически установит порядок вкладок для вас на основе порядка, в котором компоненты были добавлены в MXML. Если ваш MXML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="200" minHeight="200">

  <s:TextInput id="textInput1" 
               x="0" y="0" 
               text="TEXT INPUT #1" />
  <s:ComboBox id="comboBox2" 
              x="0" y="60">
    <s:dataProvider>
      <mx:ArrayList>
        <fx:String>Red</fx:String>
        <fx:String>Orange</fx:String>
        <fx:String>Yellow</fx:String>
        <fx:String>Blue</fx:String>
        <fx:String>Green</fx:String>
      </mx:ArrayList>
    </s:dataProvider>
  </s:ComboBox>
  <s:TextInput id="textInput2" 
               x="0" y="30"
               text="TEXT INPUT #2" />
</s:Application>

Когда вы нажимаете кнопку табуляции для перемещения между полями, она переходит к TextInput1, затем Combobox1, затем TextInput2, даже если они расположены в другом порядке в зависимости от их x, y координаты. Это связано с порядком, в котором эти компоненты появляются в MXML. Когда вы устанавливаете свойство tabIndex, вы можете вручную управлять порядком вкладок.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="200" minHeight="200">

  <s:TextInput id="textInput1" 
               x="0" y="0" 
               text="TEXT INPUT #1"
               tabIndex="1"/>
  <s:ComboBox id="comboBox2" 
              x="0" y="60"
              tabIndex="3">
    <s:dataProvider>
      <mx:ArrayList>
        <fx:String>Red</fx:String>
        <fx:String>Orange</fx:String>
        <fx:String>Yellow</fx:String>
        <fx:String>Blue</fx:String>
        <fx:String>Green</fx:String>
      </mx:ArrayList>
    </s:dataProvider>
  </s:ComboBox>
  <s:TextInput id="textInput2" 
               x="0" y="30"
               text="TEXT INPUT #2"
               tabIndex="2"/>
</s:Application>

Что касается границы фокуса, если вы не устанавливаете пользовательскую обложку для своих компонентов, они все равно должны иметь рамку по умолчанию с синей рамкой вокруг них. Компонент Combobox также может получить фокус без проблем. Убедитесь, что для свойства tabFocusEnabled также не установлено значение false.

0 голосов
/ 09 августа 2011

(1) Я бы, вероятно, просто позволил бы Flex обрабатывать вкладки, а не управлять им самостоятельно.

(2) Используете ли вы собственную обложку для TextInput, в которой нет обложки для фокуса

...