Actionscript 3 单选按钮上的空格键和箭头键触发类型错误:错误#1009
我刚刚在我的应用程序中发现了一个bug,它看起来像一个Flash播放器bug,我想知道是否有人找到了解决方法或其他什么 我的应用程序中有一些单选按钮组。如果在按住空格键的同时按下箭头键,它最终会触发Actionscript 3 单选按钮上的空格键和箭头键触发类型错误:错误#1009,actionscript-3,air,Actionscript 3,Air,我刚刚在我的应用程序中发现了一个bug,它看起来像一个Flash播放器bug,我想知道是否有人找到了解决方法或其他什么 我的应用程序中有一些单选按钮组。如果在按住空格键的同时按下箭头键,它最终会触发 TypeError: Error #1009: Cannot access a property or method of a null object reference. at fl.controls::LabelButton/drawIcon() at fl.controls
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.controls::LabelButton/drawIcon()
at fl.controls::LabelButton/draw()
at fl.controls::RadioButton/draw()
at fl.core::UIComponent/callLaterDispatcher()
如果被发现,那就说明了我的处境。
你认为有什么解决办法吗?它真的是一个flash bug吗?实际上它不是一个flash bug,而是组件的bug。如果空格键不需要你的单选按钮(我认为它没用),你可以通过创建你自己的MyRadioButton来禁用它,它扩展了RadioButton类,这将是禁用空格键输入
package {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
public class MyRadioButton extends RadioButton{
public function MyRadioButton() {
super();
}
override protected function keyUpHandler(event:KeyboardEvent):void {
if(event.keyCode != Keyboard.SPACE){
super.keyUpHandler(event);
}
}
override protected function keyDownHandler(event:KeyboardEvent):void {
if(event.keyCode != Keyboard.SPACE){
super.keyDownHandler(event);
}
}
}
}
只需将类库元素“RadioButton”中的类属性fl.controls.RadioButton更改为MyRadioButton即可。(我假设MyRadioButton在佛罗里达州附近)
------>编辑
这是另一个不禁用空格键的解决方案。这一次,当用户在spacebar keyup之前进行anykeydown时,代码在anykeydown之前运行spacebar keyup。并且焦点从单选按钮上移除,你们也可以添加任何其他的解决方案,比如,若空格键状态关闭,不要让任何键关闭
package {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
import flash.events.Event;
public class MyRadioButton extends RadioButton{
private var _isSpaceDown:Boolean = false;
public function MyRadioButton() {
super();
}
override protected function handleChange(event:Event):void {
if (_isSpaceDown) {
keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
setMouseState('up');
}
super.handleChange(event);
}
override protected function keyUpHandler(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.SPACE){
if(_isSpaceDown){
_isSpaceDown = false;
}else{
return;
}
}
super.keyUpHandler(event);
}
override protected function keyDownHandler(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.SPACE){
_isSpaceDown = true;
}else{
if(_isSpaceDown){
var e:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN);
e.keyCode = Keyboard.SPACE;
super.keyUpHandler(e);
_isSpaceDown = false;
}
}
super.keyDownHandler(event);
}
}
}事实上,它不是一个flash bug,而是组件的bug。如果空格键不需要你的单选按钮(我认为它没用),你可以通过创建你自己的MyRadioButton来禁用它,它扩展了RadioButton类,这将是禁用空格键输入
package {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
public class MyRadioButton extends RadioButton{
public function MyRadioButton() {
super();
}
override protected function keyUpHandler(event:KeyboardEvent):void {
if(event.keyCode != Keyboard.SPACE){
super.keyUpHandler(event);
}
}
override protected function keyDownHandler(event:KeyboardEvent):void {
if(event.keyCode != Keyboard.SPACE){
super.keyDownHandler(event);
}
}
}
}
只需将类库元素“RadioButton”中的类属性fl.controls.RadioButton更改为MyRadioButton即可。(我假设MyRadioButton在佛罗里达州附近)
------>编辑
这是另一个不禁用空格键的解决方案。这一次,当用户在spacebar keyup之前进行anykeydown时,代码在anykeydown之前运行spacebar keyup。并且焦点从单选按钮上移除,你们也可以添加任何其他的解决方案,比如,若空格键状态关闭,不要让任何键关闭
package {
import flash.events.KeyboardEvent;
import fl.controls.RadioButton;
import flash.ui.Keyboard;
import flash.events.Event;
public class MyRadioButton extends RadioButton{
private var _isSpaceDown:Boolean = false;
public function MyRadioButton() {
super();
}
override protected function handleChange(event:Event):void {
if (_isSpaceDown) {
keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
setMouseState('up');
}
super.handleChange(event);
}
override protected function keyUpHandler(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.SPACE){
if(_isSpaceDown){
_isSpaceDown = false;
}else{
return;
}
}
super.keyUpHandler(event);
}
override protected function keyDownHandler(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.SPACE){
_isSpaceDown = true;
}else{
if(_isSpaceDown){
var e:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN);
e.keyCode = Keyboard.SPACE;
super.keyUpHandler(e);
_isSpaceDown = false;
}
}
super.keyDownHandler(event);
}
}
}因此,我调查了这个问题,发现标准fl组件中存在错误。这不仅仅是关于RadioButton。如果您按住空格键,然后通过单击“TAB”按钮切换当前UI元素,您将收到类似的错误 要解决这个问题,您应该修复组件的源代码:在类
LabelButton
中,方法keyupdhandler
替换代码
setMouseState(oldMouseState);
与
并添加覆盖:
override protected function focusOutHandler(event:FocusEvent):void {
if (oldMouseState) {
keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
}
super.focusOutHandler(event);
}
如果你不知道,你可以怎么做:
Adobe Flash CS5安装文件夹\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls\LabelButton.as
复制到另一个具有相同包结构的目录\fl\controls\LabelButton.as
这不是一个很好的方法,但在这种情况下,它确实修复了这个错误。顺便说一句,我会把它发送到Adobe。所以,我调查了这个问题,发现标准fl组件中有一个错误。这不仅仅是关于RadioButton。如果您按住空格键,然后通过单击“TAB”按钮切换当前UI元素,您将收到类似的错误 要解决这个问题,您应该修复组件的源代码:在类
LabelButton
中,方法keyupdhandler
替换代码
setMouseState(oldMouseState);
与
并添加覆盖:
override protected function focusOutHandler(event:FocusEvent):void {
if (oldMouseState) {
keyUpHandler(new KeyboardEvent(KeyboardEvent.KEY_UP, true, true, 0, Keyboard.SPACE));
}
super.focusOutHandler(event);
}
如果你不知道,你可以怎么做:
Adobe Flash CS5安装文件夹\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls\LabelButton.as
复制到另一个具有相同包结构的目录\fl\controls\LabelButton.as
这不是一个很好的方法,但在这种情况下,它确实修复了这个错误。顺便说一句,我会将其发送到Adobe。抱歉,这不是一个好的解决方案-keybord在UI中可能非常有用,我们必须避免切断此功能。当然,但我认为空格键是无用的(不是键盘:))我不能作为RadioButton上的用户使用它。我检查了你的解决方案,但我不认为问题在于修复只是修复了错误,而不是修复了可用性。如果你想使用空格键,我正在添加另一个解决方案。我现在已经添加了完整修复的解决方案。使用按钮和单选按钮组合进行检查。是的,问题已经够深了,但可以解决,只需要测试。再说一遍,这不仅仅是RadioButton的问题。顺便说一句,如果你在我的解决方案中发现错误,请告诉我。谢谢,我考过了。它的focusout在可用性方面有一个小缺陷,这不是什么大问题,但我建议使用override Handle Change not focusout我也覆盖了我的,因为它在用空格键单击单选按钮进行响应时出现了问题。我也不喜欢这个覆盖focusOut,但是handleChange-是RadioButton的方法,所以它不足以修复按钮等等。对不起,这不是一个好的解决方案-keybord在UI中可能非常有用,我们必须避免切断这个功能。当然,但我认为空格键是无用的(不是键盘:))我不能作为RadioButton上的用户使用它。我检查了你的解决方案,但我不认为问题在于修复只是修复了错误,而不是修复了可用性。如果你想使用空格键,我正在添加另一个解决方案。我现在已经添加了完整修复的解决方案。使用按钮和单选按钮组合进行检查。是的,问题已经够深了,但可以解决,只需要测试。再说一遍,这不仅仅是RadioButton的问题。顺便说一句,如果你在我的解决方案中发现错误,请告诉我。谢谢,我考过了。它的focusout在可用性方面有一个小缺陷,这不是什么大问题,但我建议使用override Handle Change not focusout我也覆盖了我的,因为它在用空格键单击单选按钮进行响应时出现了问题。我也不喜欢这个override focusOut,但是handleChange-是RadioButton的方法,所以它不足以修复Button等等。我已经实现了您的解决方案,thx:)我只是在等待社区评估其他解决方案,但是