我正在创建一个对话框作为Java应用程序的一部分。我正在使用groovy的swingBuilder,在尝试打包JDialog时遇到了一些困难。请参阅以下代码:
import groovy.swing.SwingBuilder
import javax.swing.*
swing = new SwingBuilder()
swing.edt{
frame(id: 'mainFrame', title: 'Test', size: [200,200], visible: true, locationRelativeTo: null, resizable: false){
panel{
button('Click me', actionPerformed: {createAssessmentCategoryDialog()})
}
}
}
public JPanel createAssessmentCategoryPanel(){
swing.panel(id: 'assessmentCategoryPanel'){
panel{
panel(layout: gridLayout(rows:2, cols:2, hgap:4, vgap:4)){
label("Category Name", horizontalAlignment: JLabel.RIGHT)
textField(id: 'categoryName', columns: 12)
button('Save & add another', actionPerformed:{saveAssessmentCategoryInfo()}).toolTipText = 'Saves and clears field'
button('Close', actionPerformed:{assessmentCategoryDialog.visible = false}).toolTipText = 'Closes dialog without saving'
}
}
}
return swing.assessmentCategoryPanel
}
public void createAssessmentCategoryDialog(){
assessmentCategoryDialog = new JDialog(swing.mainFrame, "Add Assessment Category", true)
assessmentCategoryDialog.resizable = false
assessmentCategoryDialog.defaultCloseOperation = JDialog.DISPOSE_ON_CLOSE
assessmentCategoryDialog.contentPane.add(createAssessmentCategoryPanel())
assessmentCategoryDialog.pack()
assessmentCategoryDialog.locationRelativeTo = swing.mainFrame
assessmentCategoryDialog.visible = true
}
如果将此代码粘贴到groovy控制台中,它应该可以正常执行。单击“单击我”按钮后,请注意对话框下方的额外空间。
所以它的网格布局有一个标签,textField和两个按钮。它显示正常,但是当我尝试打包对话框时,我遇到了麻烦。它水平包装好但我在底部有一个额外的空间(几乎就像GridLayout的额外一行)。它使对话框看起来很奇怪。我已经将这个问题缩小到GridLayout,因为如果我只添加一行组件,它就可以很好地包装。如果我完全删除网格并添加一些其他随机组件,它包装很好。我知道我可以尝试一个替代布局管理器,但GridLayout对我来说效果不错,没有太多代码,比如GridBag。因此,除非没有其他解决方案,否则我真的更愿意坚持使用GridLayout。
如果我在JDialog上使用setSize()方法,则会调整对话框的大小,但是,在不同的主题和平台上,它的执行效果不佳。我宁愿使用pack()来调整任何平台的大小。提前感谢您的任何帮助。
答案 0 :(得分:1)
停止使用GridLayout,并切换到另一个布局。 GridLayout对于每个单元格具有相同的大小,因此它与足球球棒一样有用。所以,除非你想创造一项新运动,否则你不会发现它有用。你可以选择GridBagLayout,但令人沮丧的是冗长。我建议买TableLayout。
http://java.sun.com/products/jfc/tsc/articles/tablelayout/
这是一个效率更高的LayoutManager。比任何Sun LayoutManagers更有用。我不知道它如何与Groovy一起工作,但看起来Groovy可以使用这些类而不需要开发任何特殊的集成,所以希望你能抓住它,放入它并让它工作。
我认为你的pack()语句按设计工作,但它只是LayoutManager的错误选择。如果你纠正这个我打赌你会发现setSize()也可以。所有pack()实际上都是计算组件的首选大小,并将对话框的大小设置为该大小。但是,如果设置JDialog的大小,则组件将根据LayoutManager如何将空间分配给组件进行布局。自下而上的不同之处在于单个组件决定对话框的大小与自上而下的对话框中所说的大小,而底部组件确定了它们的大小。
答案 1 :(得分:1)
正如chubbard所建议的,我退出使用GridLayout并使用了TableLayout。该库免费提供以下网址上的一些优秀文档:
http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/
在习惯之后花了一点时间,但这种布局管理似乎可以实现几乎任何布局。请参阅上面的jar,文档和API的URL。再次感谢chubbard。
groovy可以在没有任何特殊集成的情况下使用这些类。只要您熟悉使用swing进行UI操作,就可以轻松地将任何UI组件,布局等转换为groovy代码。所以我做到了,很好。请注意:即使你无法转换为groovy,在.groovy文件中编写常规java也是完全没问题的。 Groovy并没有强迫你以常规的方式做事:)