Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JDialog与包含GridLayout的JPanel打包?_Layout_Groovy_Jdialog_Pack - Fatal编程技术网

如何将JDialog与包含GridLayout的JPanel打包?

如何将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

我正在创建一个对话框作为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控制台中,它应该可以正常执行。单击“单击我”按钮后,请注意对话框下方的额外空间

因此,它是一个网格布局,有一个标签、文本字段和两个按钮。它显示得很好,但当我尝试打包对话框时,我遇到了麻烦。它在水平方向上收纳得很好,但底部有一个额外的空间(几乎像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,非常容易使用。很好的跟进。谢谢你,马克。