Hatena::ブログ(Diary)

Foo am I? このページをアンテナに追加 RSSフィード

2009-03-18

Reflection Example for HBox and VBox

「HBox と VBox をリフレクションで作れるか」という コメント を頂いたので、サンプルを作ってみました。

This is my answer to the question. Please refer to the following code.


実行結果 (result)

f:id:hide1080:20090318231618j:image


package fooami.reflection;

import javafx.reflect.*;

/**
 * Reflection Example.
 * @author hide1080
 */

var color1 = javafx.scene.paint.Color.RED;
var color2 = javafx.scene.paint.Color.BLUE;
var color3 = javafx.scene.paint.Color.YELLOW;
var color4 = javafx.scene.paint.Color.GREEN;

function run(args: String[]) {
    var context = FXLocal.getContext();

    // リフレクションで4個の Rectangle を作成する。
    // Create four mirror objects by reflection api for rectangle.
    var classRect = context.findClass("javafx.scene.shape.Rectangle");
    var objValRect1 = classRect.allocate();
    objValRect1.initVar("translateX", context.mirrorOf(5.0));
    objValRect1.initVar("translateY", context.mirrorOf(5.0));
    objValRect1.initVar("width", context.mirrorOf(100.0));
    objValRect1.initVar("height", context.mirrorOf(100.0));
    objValRect1.initVar("fill", context.mirrorOf(color1));
    objValRect1 = objValRect1.initialize();

    var objValRect2 = classRect.allocate();
    objValRect2.initVar("translateX", context.mirrorOf(5.0));
    objValRect2.initVar("translateY", context.mirrorOf(5.0));
    objValRect2.initVar("width", context.mirrorOf(100.0));
    objValRect2.initVar("height", context.mirrorOf(100.0));
    objValRect2.initVar("fill", context.mirrorOf(color2));
    objValRect2 = objValRect2.initialize();

    var objValRect3 = classRect.allocate();
    objValRect3.initVar("translateX", context.mirrorOf(5.0));
    objValRect3.initVar("translateY", context.mirrorOf(5.0));
    objValRect3.initVar("width", context.mirrorOf(100.0));
    objValRect3.initVar("height", context.mirrorOf(100.0));
    objValRect3.initVar("fill", context.mirrorOf(color3));
    objValRect3 = objValRect3.initialize();

    var objValRect4 = classRect.allocate();
    objValRect4.initVar("translateX", context.mirrorOf(5.0));
    objValRect4.initVar("translateY", context.mirrorOf(5.0));
    objValRect4.initVar("width", context.mirrorOf(100.0));
    objValRect4.initVar("height", context.mirrorOf(100.0));
    objValRect4.initVar("fill", context.mirrorOf(color4));
    objValRect4 = objValRect4.initialize();

    // リフレクションで2個の HBox を作成する。
    // Create two HBox mirror objects, then,
    // they have a couple of rectangle's mirror in each.
    var classHBox = context.findClass("javafx.scene.layout.HBox");
    var objValHBox1 = classHBox.allocate();
    objValHBox1.initVar("spacing", context.mirrorOf(5.0));
    objValHBox1 = objValHBox1.initialize();
    // initVar でシーケンスタイプのフィールドを初期化しようとすると
    // 内部で FXLocal.SequenceValue から FXLocal.ObjectValue への
    // ClassCastException となってしまうので FXVarMember を介して
    // シーケンスを設定する。
    // Note: because ClassCastException (from FXLocal.SequenceValue
    // to FXLocal.ObjectValue) happened internally when it tried to
    // initialize the field of the sequence type with initVar(),
    // I'll set via FXVarMember.
    var seqValue = context.makeSequence(objValRect1.getType(),
    objValRect1, objValRect2);
    var varMember = classHBox.getVariable("content");
    varMember.setValue(objValHBox1, seqValue);

    var objValHBox2 = classHBox.allocate();
    objValHBox2.initVar("spacing", context.mirrorOf(5.0));
    objValHBox2 = objValHBox2.initialize();
    seqValue = context.makeSequence(objValRect1.getType(),
    objValRect3, objValRect4);
    varMember.setValue(objValHBox2, seqValue);

    // VBox を作成する。
    // Create a VBox.
    var classVBox = context.findClass("javafx.scene.layout.VBox");
    var objValVBox = classVBox.allocate();
    objValVBox.initVar("spacing", context.mirrorOf(5.0));
    objValVBox = objValVBox.initialize();
    seqValue = context.makeSequence(objValHBox1.getType(),
        objValHBox1, objValHBox2);
    varMember = classVBox.getVariable("content");
    varMember.setValue(objValVBox, seqValue);

    // Scene を作成する。
    // Create a Scene.
    var classScene = context.findClass("javafx.scene.Scene");
    var objValScene = classScene.allocate();
    objValScene.initVar("width", context.mirrorOf(215.0));
    objValScene.initVar("height", context.mirrorOf(215.0));
    objValScene = objValScene.initialize();
    seqValue = context.makeSequence(objValVBox.getType(), objValVBox);
    varMember = classScene.getVariable("content");
    varMember.setValue(objValScene, seqValue);

    // Stage を作成する。
    // Create a Stage.
    var classStage = context.findClass("javafx.stage.Stage");
    var objValStage = classStage.allocate();
    objValStage.initVar("title", context.mirrorOf("Reflection Example"));
    objValStage.initVar("scene", objValScene);
    objValStage = objValStage.initialize();
    var stage = (objValStage as FXLocal.Value).asObject();

    return stage;
}

Sarah.hSarah.h 2009/03/19 00:50 Hi,
Thanks but i think that there is a problem..i mean,the code generates a bug on the compiler :
var composant: Composants = Composants{};
Note: The following error is an internal error in the OpenJFX compiler (1.1.0).
Please file a bug at the Openjfx-compiler issues home (https://openjfx-compiler.dev.java.net/Issues) after checking for duplicates. Include the following diagnostic in your report and, if possible, the source code which triggered this problem. Thank you.

Besides,i have a question that u may can help me in it :
i tryed to creat a Swingbutton with reflection,but there is a problem with its action..did u tryed once to creat a button with reflection ?
Thanks any way
Sarah.H

hide1080hide1080 2009/03/20 20:32 Sarah.H,
Unfortunately, I can't solve your first problem.
Perhaps, I think you should try to search same problem at the Openjfx-compiler issues home.
http://javafx-jira.kenai.com/secure/IssueNavigator.jspa.

About second problem, I sent reply email to you.
As result, I could create SwingButton with reflection.

acespeedacespeed 2010/10/15 05:45 こんにちは。お久しぶりです。今、ようやく重い腰を上げてモノ作りを始めつつあります。その中でreflectに光明を見いだし、勉強中なのですが、最後の行のasObject()について教えて頂けないでしょうか。objValStage.asObject();だけでも同じように動くように見えるのですが、違いは何でしょう? またasObjectはAPIリファレンスを見ても意味不明ですし、そもそもこれは何か全く分からないのですが、hide1080さんはどうして分かってしまったのか!秘密を教えて頂けないでしょうか。よろしくお願い致します。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hide1080/20090318/1237386063