2013-04-17 59 views
2

我需要输入TLF文本字段中的文本在用户更改时进行修改。至于例子中,我试图使它大写每个用户添加或删除角色时间:为什么这个TLFTextField代码只能工作一次?

import fl.text.TLFTextField; 
import flashx.textLayout.formats.TextLayoutFormat; 
import flashx.textLayout.elements.TextFlow; 

var myTLFTextField:TLFTextField = new TLFTextField(); 
addChild(myTLFTextField); 
myTLFTextField.x = 10; 
myTLFTextField.y = 10; 
myTLFTextField.width = 200 
myTLFTextField.height = 100; 
myTLFTextField.text = "This is my text"; 

var myFormat:TextLayoutFormat = new TextLayoutFormat(); 
myFormat.textIndent = 8; 
myFormat.color = 0x336633; 
myFormat.fontFamily = "Arial, Helvetica, _sans"; 
myFormat.fontSize = 24; 

var myTextFlow:TextFlow = myTLFTextField.textFlow; 
myTextFlow.hostFormat = myFormat; 
myTextFlow.flowComposer.updateAllControllers(); 

//-- 

myTLFTextField.addEventListener(Event.CHANGE, this.onTextFieldChange); 
function onTextFieldChange(event:Event):void 
{ 
    myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
} 

之前//--从,页面上的第一个示例采取去的代码。

当我尝试编辑的文本,它成为大写的,但在这之后的文本字段停止响应任何输入和输出称

TypeError: Error #1009: Cannot access a property or method of a null object reference. at flashx.textLayout.container::TextContainerManager/getController() at flashx.textLayout.container::TextContainerManager/mouseDownHandler()

当我注释掉addEventListener线,所有出现工作正常。

这是否意味着不可能对用户输入事件中的TLF文本字段中的文本进行更改,如使用经典文本字段可能会发生的那样?

+1

可能是一个无限循环。尝试检查是否需要在回调中更改案例; 'if(myTLFTextField.text.toUpperCase()!= myTLFTextField.text)' – Dave

+0

@Dave好的,我的问题不是关于大写(有一个内置的功能来保持文本大写),但更多的是关于对用户的文本进行更改输入事件。如果您尝试以其他方式进行更改,例如在文本的末尾添加字母“A”而不是大写,则会遇到同样的问题。 – Pleo

+0

好吧,但我的观点依然存在;它可能是通过改变文本触发回调,这将改变文本,其中(...)。我不确定*这是问题所在,但您可以通过打破该循环来进行检查。如果事实证明是问题所在,您可以尝试更改您收听的事件或使用变量标记(例如,如果已经在回调中设置为“true”)。 – Dave

回答

0

现在不能尝试你的代码,所以这是一个疯狂的猜测,但控制器似乎在你设置文本时消失。如果你这样做,会发生什么情况:

private var m_dontupdate:Boolean; 
function onTextFieldChange(event:Event):void 
{ 
    if(m_dontupdate) return; 
    m_dontupdate = true; 
    myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    myTLFTextField.textFlow.flowComposer.updateAllControllers(); 
    m_dontupdate = false; 
} 

? (我不能尝试它,因为我使用FB 4.7并且无法找到TLFTextField)。

+0

如果我是正确的,你可能需要保留对myFormat的引用,并重新设置'onTextFieldChange'格式。 – Boris

+0

与原始版本不同,这一个看起来似乎导致了带有错误瀑布的无限循环。所以,它没有工作.. – Pleo

+0

这个编辑怎么样? – Boris

-1

首先 - 你在事件监听器中做无限循环!你在事件处理程序中的代码自己调用它! TLF.text = VALUE生成类似TLF.dispatch的事件(new Event(Event.CHANGE));

所以添加事件监听器到用户操作而不是文本更改!例如为KEY_UP

二 - 正确的格式代码,所以它会被应用到新的文本:

myTLFTextField.text = NEW_VALUE; 

myTextFlow = myTLFTextField.textFlow; 
myTextFlow.hostFormat = myFormat; 

编辑:为了更清楚我添加全码:

import fl.text.TLFTextField; 
import flashx.textLayout.formats.TextLayoutFormat; 
import flashx.textLayout.elements.TextFlow; 
import flash.events.KeyboardEvent; 

var myTLFTextField:TLFTextField = new TLFTextField(); 
addChild(myTLFTextField); 
myTLFTextField.x = 10; 
myTLFTextField.y = 10; 
myTLFTextField.width = 400; 
myTLFTextField.height = 100; 
myTLFTextField.text = "This is my text"; 
myTLFTextField.type = "input"; 
//allow user to wirte in filed 

var myFormat:TextLayoutFormat = new TextLayoutFormat(); 
myFormat.textIndent = 8; 
myFormat.color = 0x336633; 
myFormat.fontFamily = "Arial, Helvetica, _sans"; 
myFormat.fontSize = 24; 

var myTextFlow:TextFlow = myTLFTextField.textFlow; 
myTextFlow.hostFormat = myFormat; 
myTextFlow.flowComposer.updateAllControllers(); 

//--; 

myTLFTextField.addEventListener(Event.CHANGE, wrongHandler); 
myTLFTextField.addEventListener(KeyboardEvent.KEY_UP, goodHandler); 
myTLFTextField.text = 'TEXT'; 
//this invoke CHANGE and trace '-' in console 

setTimeout(function(){ myTLFTextField.text = 'text';}, 500); 
//this invoke CHANGE and trace '-' in console 

function wrongHandler(event:Event):void 
{ 
    //myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    //myTextFlow = myTLFTextField.textFlow; 
    //myTextFlow.hostFormat = myFormat; 
    // above code will run infinity loop of changing text! test it by uncomment and comment KEY_UP listener! 
    trace('-'); // to see in console when and how many event was triggered 
} 

function goodHandler(event:Event):void 
{ 
    myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    myTextFlow = myTLFTextField.textFlow; // reasign formating 
    myTextFlow.hostFormat = myFormat; 
    var i:uint = myTLFTextField.text.length; 
    myTLFTextField.setSelection(i,i); // move carret to last sign 
    trace('+'); // to see in console when and how many event was triggered 
} 

输出:

  1. -
  2. -

写入后 '一' 字产出领域:

  1. -
  2. -
  3. -
  4. -
  5. +
  6. -

结果上阶段: TEXTA

+0

它不会导致任何无限循环。这可以通过在为Event.CHANGE事件添加监听器后立即尝试更改文本字段的text属性来确认,onTextFieldChange函数未被调用,仅在用户输入时调用该函数。 – Pleo

+0

你认为我错了。查看我答案中的更改。代码已经过测试,所以不要说它不起作用。 – Konrad

+0

@Pleo如果您不同意显示测试的代码,证明您的权利。 – Konrad

0

为什么?因为TLF有问题。正如其他人所指出的那样,在Event.CHANGE处理程序中更改TLF文本会导致第二次调用更改处理程序。那时,事情就会崩溃。

我想出了一个类似于@Abe发布的解决方案,但它更通用 - 它不依赖于检查大写字符。您侦听TextEvent.TEXT_INPUT,然后在文本输入处理程序中切换Event.CHANGE侦听器。

import fl.text.TLFTextField; 
import flashx.textLayout.formats.TextLayoutFormat; 
import flashx.textLayout.elements.TextFlow; 
import flash.text.TextFieldType; 
import flash.events.TextEvent; 

var myTLFTextField:TLFTextField = new TLFTextField(); 
addChild(myTLFTextField); 
myTLFTextField.x = 10; 
myTLFTextField.y = 10; 
myTLFTextField.width = 500 
myTLFTextField.height = 100; 
myTLFTextField.text = "This is my text"; 
myTLFTextField.border = true; 
myTLFTextField.multiline = true; 
myTLFTextField.type = TextFieldType.INPUT; 

var myFormat:TextLayoutFormat = new TextLayoutFormat(); 
myFormat.textIndent = 8; 
myFormat.color = 0x336633; 
myFormat.fontFamily = "Arial, Helvetica, _sans"; 
myFormat.fontSize = 24; 

var myTextFlow:TextFlow = myTLFTextField.textFlow; 
myTextFlow.hostFormat = myFormat; 
myTextFlow.flowComposer.updateAllControllers(); 

myTLFTextField.addEventListener(TextEvent.TEXT_INPUT, onTextInput); 

var selectionIndex:uint; 
function onTextInput(e:TextEvent):void 
{ 
    trace("onTextInput"); 
    selectionIndex = myTLFTextField.selectionEndIndex; 
    myTLFTextField.addEventListener(Event.CHANGE, onTextChanged); 
} 

function onTextChanged(e:Event):void 
{ 
    trace("onTextChanged"); 
    myTLFTextField.removeEventListener(Event.CHANGE, onTextChanged); 

    // Do whatever you need to do here: 
    myTLFTextField.text = myTLFTextField.text.toUpperCase(); 
    myTLFTextField.setSelection(selectionIndex + 1, selectionIndex + 1); 
} 
+0

谢谢,但是,通过此代码,闪烁的插入符号始终消失,并且删除某个字符时,该更改将被忽略。 – Pleo

相关问题