如何将JDialog与包含GridLayout的JPanel打包?
我正在创建一个对话框作为Java应用程序的一部分。我正在使用groovy的swingBuilder,在尝试打包JDialog时遇到了一些困难。请参阅下面的代码:如何将JDialog与包含GridLayout的JPanel打包?,layout,groovy,jdialog,pack,Layout,Groovy,Jdialog,Pack,我正在创建一个对话框作为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, l
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控制台中,它应该可以正常执行。单击“单击我”按钮后,请注意对话框下方的额外空间
因此,它是一个网格布局,有一个标签、文本字段和两个按钮。它显示得很好,但当我尝试打包对话框时,我遇到了麻烦。它在水平方向上收纳得很好,但底部有一个额外的空间(几乎像GridLayout中的一行)。这使对话看起来很奇怪。我已经把这个问题缩小到GridLayout,因为如果我只添加一行组件,它就可以打包了。如果我完全移除网格并添加一些其他随机组件,它会很好地打包。我知道我可以尝试另一种布局管理器,但是GridLayout对我来说很好,没有太多的代码,比如GridBag。因此,除非没有其他解决方案,否则我宁愿坚持使用GridLayout
如果我在JDialog上使用setSize()方法,对话框的大小确实会调整,但是,在不同的主题和平台上,它的性能并不是很好。我更愿意使用pack()来调整任何平台的大小。提前感谢您的帮助。停止使用GridLayout,并切换到其他布局。GridLayout的每个单元格大小相等,所以它和足球棒一样有用。所以,除非你想创造一项新的运动,否则你不会发现它有用。您可以选择GridBagLayout,但它的冗长令人沮丧。我建议把桌子布置好 这是一个更高效的布局经理。比任何Sun LayoutManager都有用。我不知道它是如何与Groovy一起工作的,但是Groovy似乎可以使用这些类,而不需要开发任何特殊的集成,所以希望您能够抓住它,将它放进去,并让它工作 我认为你的pack()语句是按设计工作的,但这只是LayoutManager的错误选择。如果你纠正这一点,我打赌你会发现setSize()也可以工作。pack()真正做的就是计算组件的首选大小,并将对话框的大小设置为该大小。但是,如果设置JDialog的大小,那么组件将只根据LayoutManager如何将空间分配给组件来进行布局。在自下而上和自上而下之间有点不同,自下而上是指单个组件决定对话框的大小,而自上而下是指对话框的大小,自下而上是指组件的大小
为了您的享受:正如查伯德所建议的,我不再使用GridLayout,而是使用TableLayout。该库免费提供一些很棒的文档,网址如下: 花了一点时间来适应,但通过这种布局管理,几乎可以实现任何布局。有关jar、文档和API,请参见上面的URL。再次感谢查伯德
groovy可以使用这些类,而无需任何特殊的集成。只要您熟悉使用swing操作UI,就可以很容易地将任何UI组件、布局等转换为groovy代码。所以我这么做了,很好。请注意:即使您无法转换为groovy,在.groovy文件中编写常规java也是非常好的。Groovy不会强迫您以Groovy的方式做事:)1)要更快地获得更好的帮助,请发布一篇文章。2) 你的问题是什么?当你弄明白了,请将它编辑到帖子中。谢谢,将在SSCCE上工作。嘿,谢谢。这需要一些修补,但我得到了我想要的。我会在下面为其他人写一篇更详细的文章。试试MigLayout,非常容易使用。很好的跟进。谢谢你,马克。