是否可以将Groovy的SwingBuilder与Java JFrame子类结合起来?

时间:2018-03-25 03:12:02

标签: java groovy windowbuilder swingbuilder

我正在编写一个Griffon / Groovy / Swing应用程序。但是,我喜欢使用像Eclipe的WindowBuilder工具那样的WYSIWYG GUI工具。

我想知道是否有可能将这两种方法结合起来?我想使用SwingBuilder来管理视图/模型绑定和一些高级GUI任务(例如JDesktopPaneJInternalFrame),但将内容设计为{{{ 1}由WindowBuilder管理。

这是一个简单的groovy脚本:

JFrame

这是JFrame的ExamplePanel子类:

package example

import groovy.swing.SwingBuilder
import java.awt.BorderLayout as BL

count = 0
new SwingBuilder().edt {
  frame(title: 'Frame', size: [300, 300], show: true) {
    desktopPane() {
      internalFrame(visible: true, bounds: [25, 25, 200, 100]) {
        borderLayout()
        textlabel = label(text: 'Click the button!', constraints: BL.NORTH)
        button(text:'Click Me',
             actionPerformed: {count++; textlabel.text = "Clicked ${count} time(s)."; println "clicked"}, constraints:BL.SOUTH)
      }

      internalFrame(visible: true, bounds: [50, 50, 200, 100]).add(new ExamplePanel())
    }
  }
}

groovy脚本创建一个package example; import javax.swing.JPanel; import java.awt.BorderLayout; import javax.swing.JLabel; import javax.swing.JButton; public class ExamplePanel extends JPanel { /** * Create the panel. */ public ExamplePanel() { setLayout(new BorderLayout(0, 0)); JLabel textLabel = new JLabel("Click the button!"); add(textLabel, BorderLayout.NORTH); JButton button = new JButton("Click Me"); add(button, BorderLayout.SOUTH); } } 和两个视觉上相同的JDesktopPane。第二个JInternalFrame包含JInternalFrame,但它没有用于检测按钮点击或更改标签内容的基础结构。

是否有一种常规方法可以在ExamplePanel中获得与ExamplePanel定义的SwingBuilder相同的行为?

2 个答案:

答案 0 :(得分:0)

这不是"答案"因为它没有回答你的问题。但是我想指出另一个方向。

GUI设计工具通常使用一些网格布局和从绘图中创建的任意位置。如果您正确使用布局,GUI可以正确响应应用程序调整大小,而设计工具的网格布局通常无法通过调整大小进行缩放。

Swing布局有一种名为Miglayout的域语言。一旦你掌握了这个想法并不难,我发现使用groovy swing builder和Miglayout很容易创建相当复杂的GUI。

我在这里的3篇博客文章中写了我的经历。

https://sites.google.com/site/dracodoc/groovy/swingbuildermiglayout

答案 1 :(得分:0)

是的,您可以使用不同的替代方案嵌入任何自定义组件:

  1. 选择一个特定节点。在您的情况下ExmaplePanel扩展Panel,因此您可以通过以下方式使用panel()节点

    internalFrame {     面板(新的ExamplePanel()) }

  2. 选择一个通用节点。您可以使用widgetcontainer。前者不接受嵌套,而后者则接受嵌套。

    internalFrame {     container(new ExamplePanel()){/ *进一步自定义* /} }

  3. 您可以创建自己的节点工厂并将其注册到构建器。格里芬指南有一节介绍如何完成。 http://griffon-framework.org/guide/2.14.0/#_views_builder_customizers