0

我正在创建一个对话框作为 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() 来调整任何平台的大小。提前感谢您的任何帮助。

4

2 回答 2

1

停止使用 GridLayout,并切换到另一个布局。GridLayout 对每个单元格都有相同的大小,因此它与足球棒一样有用。因此,除非您想创建一项新运动,否则您不会发现它有用。您可以选择 GridBagLayout,但它非常冗长。我建议获取 TableLayout。

http://java.sun.com/products/jfc/tsc/articles/tablelayout/

这是一个效率更高的 LayoutManager。比任何 Sun LayoutManager 都更有用。我不知道它是如何与 Groovy 一起工作的,但看起来 Groovy 可以使用这些类而无需开发任何特殊的集成,因此希望您可以抓住它,将其放入并让它工作。

我认为您的 pack() 语句按设计工作,但这只是 LayoutManager 的错误选择。如果你纠正了这个,我打赌你会发现 setSize() 也可以。pack() 真正做的是计算组件的首选大小并将对话框的大小设置为该大小。但是,如果您设置 JDialog 的大小,您的组件将根据 LayoutManager 将空间分配给组件的方式简单地进行布局。自下而上(单个组件决定对话框的大小)与自上而下(对话框说这里是大小)和底部组件确定它们的大小之间的区别。

为了您的享受: http: //madbean.com/anim/totallygridbag/

于 2011-10-06T04:29:56.647 回答
1

正如 chubbard 所建议的,我退出了使用 GridLayout 并使用了 TableLayout。该库是免费的,并在下面的 URL 中提供了一些很棒的文档:

http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/

花了一点时间来适应,但使用这种布局管理似乎可以实现几乎任何布局。有关 jar、文档和 API,请参见上面的 URL。再次感谢chubbard。

并且 groovy 可以使用这些类而无需任何特殊的集成。只要您熟悉使用 swing 进行 UI 操作,就可以很容易地将任何 UI 组件、布局等转换为 groovy 代码。所以我做到了,它很好。请注意:即使您无法转换为 groovy,在 .groovy 文件中编写常规 java 也是完全可以的。Groovy 不会强迫您以 groovy 的方式做事 :)

于 2011-10-06T14:15:16.973 回答