开发者

SwingBuilder like GUI syntax for Java?

Is there a library that makes it possible to write Swing based GUIs similar to the manner done by SwingBuilder in Groovy?

I am hoping to develop a Java GUI application without embedding Groovy or another complete program开发者_如何转开发ming language in Java, and I find the standard Java syntax rather tedious.


I went down this path at one point, then I found MiGLayout - unless I'm using a split pane, I can generally lay out each of my views in a single panel, with a minimum of hassle. There is a tad of a learning curve, but once you are over the hump, you can knock out a really nice looking GUI in almost no time.

The whole paradigm of nesting panels inside other panels isn't clean for a lot of designs - you wind up fighting the layout manager.


I'm not aware of such a library, though something similar would be possible (without named parameters, though, which reduces readability). Someone may have converted SwingBuilder to java.

[Looks like you can get java source for SwingBuilder at http://kickjava.com/src/groovy/swing/SwingBuilder.java.htm. I don't know how current that is]

About the closest you can come in plain java is to use the "double curly trick" (which isn't really a trick, just an anonymous inner class definition).

The SwingBuilder example on your referenced page:

new SwingBuilder().edt {
    frame(title:'Frame', size:[300,300], show: true) {
    borderLayout()
    textlabel = label(text:"Click the button!", constraints: BL.NORTH) 
    button(text:'Click Me',
           actionPerformed: {
               count++;
               textlabel.text = "Clicked  ${count} time(s).";
               println "clicked"},
               constraints:BL.SOUTH)
    }
}

could be written something like the following in Java

new JFrame() {{
    setTitle("Frame");
    setSize(300,300);
    setLayout(new BorderLayout());
    textlabel = new JLabel("Click the button!");
    add(textlabel, BorderLayout.NORTH);
    add(new JButton("Click Me") {{
        addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                count++;
                textlabel.setText("Clicked " + count + " time(s).");
                System.out.println("clicked");
        }});
    }}, BorderLayout.SOUTH);
    setVisible(true);
}};

NOTE: The problem here is that when you use

new SomeClass() {{ ... }}

it's actually creating a new class definition. I wouldn't recommend doing it very often because of this.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜