Greetings!

I sure hope this is the appropriate place to ask (perldoc Java::Swing at
least says so), if it's not, please tell me so.

The Story:
I'm pretty used to creating my GUI's via Inline::Java. Recently I've
discovered Java::Swing, which I now prefer (out of lazyness, of course
;-> ), because my mind doesn't have to switch between Java and Perl anymore.

What I like most about Java::Swing is that it allows me to code
something like this:

my $label = JLabel->new(
    {
        Text => "Hello World",
        HorizontalTextPosition => 0,
        HorizontalAlignment => 0,
    }
);

and all the Hashkeys get translated to Setters on the Object:
setText("Hello World"), setHorizontalTextPosition(0), and so on.

The Concern:
If i want my $label to hold a picture ( for example ), things start to
get difficult.
I can no longer call JLabel->new() with an anonnymous hash (hm, ok, I
can, but then my $label doesn't know about the $picture it's supposed to
hold, which is bad, because I can't add() it afterwards). I have to call
JLabel->new($picture), and then I have to call each and every Setter
manually ($label->setText("Buhu"),...). I admit, that's not as bad as a
Shot-in-the-Foot(TM), but... you know... lazyness, again.

And now for
The Solution (maybe):
After looking into Swing.pm and studying the code therein, I've decided
to make some minor tweaks (which you will find ( original Code & my
changes ) after __END__ ). These changes allow me to code like this from
now on:

my $top_label = JLabel->new(
    {
        Object => $picture,
        Text => "Hello World",
        HorizontalTextPosition => 0,
        HorizontalAlignment => 0,
    }
);

Now, after a somewhat lengthy & boring post ( If you are still reading
this and I haven't bored you off until now, many, many thanks!), finally
my questions:

Does this make any sense?
Am I the only one that lazy that I feel a need for this?
Will it break things I'm not aware of? ( Don't think so, but, hey, what
do I know?!)
Is there a way to achieve the same that I did oversee?

Many Thanks then for your patience, Opinions and Comments very welcome,

Andreas Pürzer

__END__
sub gen_generic_new {
    my $package_name = shift;
    $package_name    =~ s/\./::/g;

    return sub {
        my $class        = shift;
        my $inline_class = "Java\::Swing\::$package_name\::$class";

        # if we were passed a hash reference, construct a default
                # object, then
        # call set on each hash key with the value
        if (ref($_[0]) =~ /HASH/) {  # call no arg
constructor and                                                      # accessors
            my $attributes = shift;

            # __CHANGES__
            #my $retval     = $inline_class->new();

            my $retval;
            if ( defined $attributes->{Object} ) {
                $retval = $inline_class->new($attributes->{Object});
                delete $attributes->{Object};
            }
            else {
                $retval = $inline_class->new();
            }

            # __END_CHANGES__
            foreach my $attribute (keys %$attributes) {
                my $setter = "set" . ucfirst($attribute);
                eval { $retval->$setter($attributes->{$attribute}); };
                if ($@) {
                    croak "Error: '$attribute' is not an attribute of
$class";
                }
            }
            return $retval;
        }
        else { # pass args directly to constructor
            return $inline_class->new(@_);
        }
    }
}

-- 
perl -mAcme::JAPH

Reply via email to