我对Groovy有点了解:
有了这一切,我预计很明显Groovy SwingBuilder如何在Java中设置几英里。但是我在书和网上看到的例子看起来并不比我期望的Java版本更简洁或可读。
有人能给出一个很好的Java与Groovy的例子,真实的还是做作的,Groovy Swing会在哪里闪耀?
答案 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版本更简洁。