在什么情况下Groovy SwingBuilder优越?

时间:2013-12-27 20:13:34

标签: java swing groovy swingbuilder

我对Groovy有点了解:

  • 语法更简洁的一些方法
  • 如何在替换Java匿名内部类时使用闭包。
  • 构建者如何使树构造更容易

有了这一切,我预计很明显Groovy SwingBuilder如何在Java中设置几英里。但是我在书和网上看到的例子看起来并不比我期望的Java版本更简洁或可读。

有人能给出一个很好的Java与Groovy的例子,真实的还是做作的,Groovy Swing会在哪里闪耀?

2 个答案:

答案 0 :(得分:3)

它没有发光。它只是为您节省了大量代码。您可以抱怨,但正如我所看到的,这样的表创建比具有不同的模型类,许多不必要的行(例如方法声明和注释等)更好。

table = builder.table(constraints: BorderLayout.CENTER) {
  tableModel(list: data) {
    propertyColumn(header:'Name', propertyName: 'displayName', editable: false)
    closureColumn(header:'Value', read: IDENTITY,
    cellRenderer: cellRenderer, cellEditor: cellEditor,
    write: {row, newVal->});
} }

除了简单的表创建和非常强大的closureColumn之外,还有一个简单易读的简单示例:

new SwingBuilder().frame(pack: true, show: true, defaultCloseOperation: JFrame.EXIT_ON_CLOSE) {
    panel(layout: new BorderLayout()) {
       label constraints: BorderLayout.PAGE_START, "Header"
       button constraints: BorderLayout.PAGE_END,
           action: action(name: "Footer", closure: { println "Footer pressed" }, accelerator: "Ctrl+K" )
       list listData: 1..10, BorderLayout.CENTER 
}   }

现在,请回答,你会写多少行代码来实现这样的结果?

编辑:添加了第二个示例Groovy非SwingBuilder代码。

def panel = new JPanel(new BorderLayout())
panel.add(new JLabel("Header"), BorderLayout.PAGE_START)
panel.add(new JList(*(1..10)), BorderLayout.CENTER)

def button = new JButton(new AbstractAction("Footer") {
    {
        putValue(ACCELERATOR_KEY, "Ctrl+K");
    }
    @Override void actionPerformed(ActionEvent actionEvent) {
        println "Footer pressed"
    }
})
panel.add(button, BorderLayout.PAGE_END)

def frame = new JFrame()
frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE
frame.contentPane = panel
frame.pack()
frame.visible = true

答案 1 :(得分:3)

SwingBuilder提供的bean绑定实现简洁,可读性高于普通Swing。您仍然可以在SwingBuilder中使用现有的Swing布局或组件。如果您需要某些东西并且SwingBuilder没有提供它,您可以随时为该功能创建一个新的可重用节点。

例如,这就是我在SwiffBuilder中使用MigLayout布局和Griffon框架中的几个自定义节点的方法:

taskPane(id: "form", title: 'Date Entry', layout: new MigLayout('', '[right][left][left,grow]','')) {

    label('Invoice No:')
    textField(id: 'invoiceNo', columns: 15, text: bind('invoiceNo', target: model, mutual: true), errorPath: 'invoiceNo')
    errorLabel(path: 'invoiceNo', constraints: 'wrap')

    label('Date:')
    dateTimePicker(id: 'date', localDate: bind('date', target: model, mutual: true), errorPath: 'date', dateVisible: true, timeVisible: false)
    errorLabel(path: 'date', constraints: 'wrap')

    label('Customer:')
    comboBox(id: 'customer', model: model.customer, errorPath: 'customer')
    errorLabel(path: 'customer', constraints: 'wrap')

    label('Discount:', visible: bind {!model.isDiscAvailable})
    numberTextField(id: 'disc', columns: 20, bindTo: 'disc', visible: bind {!model.isDiscAvailable}, errorPath: 'disc')
    errorLabel(path: 'disc', visible: bind {!model.isDiscAvailable}, constraints: 'wrap')

}

我相信上面的代码比纯粹的Swing版本更简洁。