Конвертировать TextArea в TextField в AS3 - PullRequest
1 голос
/ 19 сентября 2011

У меня есть компонент TextArea в моем MovieClip.Когда я дважды щелкаю по нему, я хочу переключиться на компонент TextField, что позволяет мне изменять его содержимое.Когда я нажимаю снаружи, я хочу перезапустить исходный класс (TextArea).

Как я могу это сделать?

Я делаю это, но не работает:

element.addEventListener(MouseEvent.DOUBLE_CLICK, changeName);

private function changeName(e:MouseEvent):void{
   e.target.type = TextFieldType.INPUT;
}

Где element - TextArea (классический и динамический текст).Спасибо!

РЕДАКТИРОВАТЬ:

enter image description here

Так выглядит мой мувиклип.«Имя» - это TextArea, для которого я хочу разрешить изменения пользователя.Я устанавливаю это так:

enter image description here

[испанский интерфейс]

  1. Nombre de instancia = Имя экземпляра (пусто)
  2. Texto clásico (классический текст)
  3. Texto dinámico (динамический текст)

MovieClip управляет моим собственным базовым классом (называемым «ConfLayer»).Внутри него у меня есть это:

public function doStuff(e:MouseEvent):void{
   // element = TextArea 'Name'
   element.addEventListener(MouseEvent.DOUBLE_CLICK, changeName);
}

private function changeName(e:MouseEvent):void {
   var tarea:TextArea = e.target as TextArea;
   var tf:TextField = tarea.TextField;    // this line throwing error
   tf.type = TextFieldType.INPUT;
}

Поскольку AS3 выдает мне ошибки, я попробовал это:

private function changeName(e:MouseEvent):void {
   e.target.TextField.type = TextFieldType.INPUT;
}

Когда я дважды щелкаю элемент TextArea, предыдущая строка удаляется, и я могуничего не пиши.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2011

Вы делаете поле редактируемым только после второго клика.Моя идея в том, что уже поздно.поле доступно для редактирования, но вам нужно будет нажать еще раз.Итак, попробуйте сделать редактируемые некоторое время (например, 300 миль) после первого щелчка.Если щелчка нет, вы возвращаете тип DYNAMIC.После второго щелчка вы начнете редактировать текстовое поле.

0 голосов
/ 22 сентября 2011

Я решил собственную проблему, используя свойства background и border из TextField.Вместо того, чтобы создавать TextField непосредственно в моем MovieClip, я создаю его динамически.

// Field 'Name' of the layer
var tarea:TextField = new TextField();
tarea.text = 'Layer';
tarea.x = -80;
tarea.y = -23;
tarea.type = TextFieldType.DYNAMIC;
tarea.height = 20;

// Format the TextField
var format_tarea:TextFormat = new TextFormat();
format_tarea.font = "Arial";
format_tarea.size = 14;
format_tarea.bold = true;

tarea.setTextFormat(format_tarea,0,tarea.length);

Затем я добавляю несколько слушателей, чтобы разрешить изменения, когда я нажимаю на него:

// Add event to allow name changes
tarea.addEventListener(MouseEvent.CLICK,changeName);

Когда янажмите клавишу ВВОД, я принимаю изменения

// Add event to accept changes on press ENTER key
tarea.addEventListener(KeyboardEvent.KEY_DOWN,acceptKeyboardName);

Когда TextField потерял фокус, также принимаем изменения:

tarea.addEventListener(FocusEvent.FOCUS_OUT,acceptFocusName);

Последнее, я добавил в свой MovieClip

// Add to MC
mc.addChild(tarea);

Обработчики, связанные с нижеприведенными событиями:

private function changeName(e:MouseEvent):void
{
    e.target.setSelection(0,e.target.text.length);
    e.target.border = true;
    e.target.background = true;
    e.target.type = TextFieldType.INPUT;
}

private function acceptKeyboardName(e:KeyboardEvent):void
{
    if (e.charCode == 13)   // When pres ENTER, remove border, background and restore dynamic type
    {
        e.target.type = TextFieldType.DYNAMIC;
        e.target.border = false;
        e.target.background = false;
    }
}

private function acceptFocusName(e:FocusEvent):void
{
    // When lost focus, remove border, background and restore dynamic type
    e.target.type = TextFieldType.DYNAMIC;
    e.target.border = false;
    e.target.background = false;
}
0 голосов
/ 19 сентября 2011

После моего комментария выше, TextArea имеет свойство текстового поля.

Так что вы должны быть в состоянии сделать что-то вроде этого:

private function changeName(e:MouseEvent):void{

   var tarea:TextArea = e.target as TextArea;
   var tf:TextField = tarea.textField; //make sure that textfield is camelCase!!!
   tf.type = TextFieldType.INPUT;
}
...