最速怪談選手権

コンポーネントのコンボボックスでこのように書きました。
コンボボックスの選択肢とは別にテキストをクリックするとフォント名を取得します。

クリックしたテキストに設定されているフォント名を、コンボボックスのセレクト値に
したいのですが、どうすればいいでしょうか?

■エラー内容
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at test/changeHandler()

■AS3
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import fl.events.*;
import fl.controls.*;
import fl.data.DataProvider;

public class test extends MovieClip
{
var comboData:Array = new Array(
{label:"フォント1"},
{label:"MS ゴシック"},
{label:"フォント3"}
);

var combobox_cb:ComboBox;
var combobox_cb:ComboBox;

var format:TextFormat;
var text:TextField;

public function test()
{
init();
}

private function init():void
{
combobox_cb = new ComboBox();

combobox_cb.dropdownWidth = 200;
combobox_cb.width = 200;
combobox_cb.move(150, 50);

combobox_cb.dataProvider = new DataProvider(comboData);
combobox_cb.prompt = 'フォント2';

format = new TextFormat();
format.font = "MS ゴシック"

text = new TextField();
text.defaultTextFormat = format;
text.text = 'テキスト';

addChild(combobox_cb);
addChild(text);

text.addEventListener(MouseEvent.CLICK, changeHandler);
}

private function changeHandler(e:Event):void
{
trace(e.currentTarget.getTextFormat().font);
combobox_cb.selectedItem.label = e.currentTarget.getTextFormat().font;//ここでエラー
}
}
}

A 回答 (1件)

まず...,


大きく誤解をされているように思うのですが。。。

combobox_cb.selectedItem.label = ○○;

↑これだと(仮にこれが通用したとしても),
コンボボックス「combobox_cb」で選択しているアイテムのラベルが「○○」になってしまうだけですよ。

わかりますでしょうか?

他のものに喩えるなら
「バッター(打者)をAからBに変更する」
のではなくて
「バッター(打者)の名前をAからBに変更する」
みたいな感じになるというか。。。

つまり
「選択アイテム自体を切り替える」のではなくて
「選択されたアイテムのラベルを変える」になってしまうということです。
(場合によっては同名のラベルがどんどん増えていくことになる。)

そうではなく,
「選択アイテム自体を切り替える」」のでしたら,
selectedItem.label ではなく
selectedIndex を変える必要があります。

 

それと...,
スクリプト中に次の1行↓がありますよね。

combobox_cb.prompt = 'フォント2';

この prompt を設定した場合
コンボボックスのアイテム 非選択時 には
デフォルトでその prompt である「フォント2」の項目が選択されているということになるんです。
selectedIndex で言うところの -1 が選択状態になるということです。

この prompt には label というものがそもそもありません。
label などないのでそれを変えようとしても
> TypeError: Error #1009: null のオブジェクト参照…
となるのです。

 

あくまでも私の推測ですが
ですから二重に誤解されているような気がします。

というわけで
私の推測を含む↓修正例(★の部分)です。

//---------------------------------------
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import fl.events.*;
import fl.controls.*;
import fl.data.DataProvider;

public class test extends MovieClip
{
var comboData:Array = new Array(
{label:"フォント1"},
{label:"MS ゴシック"},
{label:"フォント3"}
);

var combobox_cb:ComboBox;
//★↓重複しているので削除↓★
//var combobox_cb:ComboBox;

var format:TextFormat;
var text:TextField;

public function test ()
{
init ();
}

private function init ():void
{
combobox_cb = new ComboBox();

combobox_cb.dropdownWidth = 200;
combobox_cb.width = 200;
combobox_cb.move (150, 50);

combobox_cb.dataProvider = new DataProvider(comboData);
combobox_cb.prompt = 'フォント2';

format = new TextFormat();
format.font = "MS ゴシック";

text = new TextField();
text.defaultTextFormat = format;
text.text = 'テキスト';

addChild (combobox_cb);
addChild (text);

text.addEventListener (MouseEvent.CLICK, changeHandler);
}

private function changeHandler (e:Event):void
{
trace (e.currentTarget.getTextFormat().font);

//★---↓以下変更↓---★
//コンボボックスの各アイテムをループ
for (var i:int = 0; i <= combobox_cb.length-1; i++)
{
//もしラベルとフォント名が同じであれば
if (combobox_cb.getItemAt(i).label == e.currentTarget.getTextFormat().font)
{
//そのアイテムを選択
combobox_cb.selectedIndex = i;
//この forループ を抜ける
break;
}
}

}
}
}
//---------------------------------------

 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!